IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comparer l'attribut 'Modifié le' d'un fichier


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut Comparer l'attribut 'Modifié le' d'un fichier
    Bonjour,

    J'ai un thread qui copie tout le contenu d'un dossier qu'on lui passe en paramètre. Je voudrais l'adapter pour faire des copies incrémentielles cad qu'il ne prenne que les fichiers modifiés depuis la dernière copie.
    Pour cela, je pensais que ce bout de code marcherait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(File.GetLastWriteTime(fichier_source)>File.GetLastWriteTime(fichier_copié))
    { File.Copy ... }
    Ceci marche mais dans certains cas précis, par ex lors d'une copie où la source et la destination sont des chemins réseau cela fonctionne pas pour plusieurs fichiers pas tous ( assez étrange ).

    Est-ce que ma méthode est viable, enfin je ne pense pas vu que j'ai des soucis ?

    Merci
    http://stef-le-buffle.labrute.com

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Attention, dans le cas d'un fichier copié, la date de création peut être supérieure à la date de modification (voir screenshot)
    Ton problème est peut-être lié à ça ?

  3. #3
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Attention, dans le cas d'un fichier copié, la date de création peut être supérieure à la date de modification (voir screenshot)
    Ton problème est peut-être lié à ça ?
    Oui mais pour ma comparaison, je m'appuie sur la date de modification et non sur la date de création.

    edit : Cependant, tu as peut être raison car je viens de réaliser la même comparaison en ne prenant que la date et non la date et l'heure et là ça marche bien. Mais bon le phénomène de recopie devrait se produire sur tous les fichiers, non ?

    Dois-je plutôt m'appuyer sur l'attribut d'archivage du fichier ?
    http://stef-le-buffle.labrute.com

  4. #4
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(File.GetLastWriteTime(fichier_source).date>File.GetLastWriteTime(fichier_copié).date) 
    {
    if(File.GetLastWriteTime(fichier_source).time>File.GetLastWriteTime(fichier_copié).time)
    {
    File.Copy ... 
    }
    }
    Ce code marche mais on ne peut pas faire mieux ? J'hésite à utiliser l'attribut archive des fichiers.

    Qu'en pensez-vous ?
    http://stef-le-buffle.labrute.com

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Euh, je vois pas trop l'intérêt de cette modif... si date1 > date2, ça ne sert à rien de vérifier que heure1 > heure2...

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Tu peux te baser aussi sur la taille du fichier mais bon ça marche pas si l'utilisateur ne rajoute rien...

    Sinon pourquoi tu prends pas le problème à l'inverse c'est à dire que tu vérifie que leur date de modification est identique au lieu de comparer leur dates...

  7. #7
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Euh, je vois pas trop l'intérêt de cette modif... si date1 > date2, ça ne sert à rien de vérifier que heure1 > heure2...
    C'est vrai quand on sauvegarde une seule fois par jour ce qui est le cas .
    Prenons le cas où l'on sauvegarde plusieurs fois par jour, un fichier peut être modifié dans la journée donc il n'est pas inutile de comparer l'heure.

    Enfin dans mon cas, c'est inutile effectivement.
    http://stef-le-buffle.labrute.com

  8. #8
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par harz62 Voir le message
    Tu peux te baser aussi sur la taille du fichier mais bon ça marche pas si l'utilisateur ne rajoute rien...

    Sinon pourquoi tu prends pas le problème à l'inverse c'est à dire que tu vérifie que leur date de modification est identique au lieu de comparer leur dates...
    cela revient au même non ?
    http://stef-le-buffle.labrute.com

  9. #9
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    J'ai toujours ce problème pour comparer cet attribut.
    Comment savoir si un fichier est + récent que celui sauvegardé ?
    http://stef-le-buffle.labrute.com

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Shypster Voir le message
    J'ai toujours ce problème pour comparer cet attribut.
    Comment savoir si un fichier est + récent que celui sauvegardé ?
    Comme tu l'as fait au début ! et si ça ne marche pas, je ne comprends pas pourquoi...

  11. #11
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Comme tu l'as fait au début ! et si ça ne marche pas, je ne comprends pas pourquoi...
    oui, mais cela marche dés lors qu'on ne passe pas en réseau.
    Ca marche partiellement quand je passe par des chemins réseau et je ne vois pas pourquoi, peut etre un souci au niveau de mes chemins d'accés, faut il mettre en forme quand un utlisateur saisie un chemin réseau ?
    http://stef-le-buffle.labrute.com

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Shypster Voir le message
    oui, mais cela marche dés lors qu'on ne passe pas en réseau.
    Ca marche partiellement quand je passe par des chemins réseau et je ne vois pas pourquoi, peut etre un souci au niveau de mes chemins d'accés, faut il mettre en forme quand un utlisateur saisie un chemin réseau ?
    Je viens de tester, pour moi ça marche nickel, même avec un chemin réseau (aussi bien avec un serveur de fichiers sous Windows qu'avec un partage Samba sous Unix).

    Par contre, j'ai une petite idée de l'origine de ton problème... tu es sûr que l'heure du système est correcte sur les serveurs hébergeant tes fichiers ? J'ai testé avec serveur Samba dont l'horloge système avance de 25mn, et même si j'ai modifié le fichier local plus récemment il m'indique que c'est le fichier distant le plus récent :
    Local : 11/04/2008 15:25:22
    Distant : 11/04/2008 15:47:39
    Local plus récent que Distant : False
    Tout ça à cause d'une horloge mal réglée...

  13. #13
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je viens de tester, pour moi ça marche nickel, même avec un chemin réseau (aussi bien avec un serveur de fichiers sous Windows qu'avec un partage Samba sous Unix).

    Par contre, j'ai une petite idée de l'origine de ton problème... tu es sûr que l'heure du système est correcte sur les serveurs hébergeant tes fichiers ? J'ai testé avec serveur Samba dont l'horloge système avance de 25mn, et même si j'ai modifié le fichier local plus récemment il m'indique que c'est le fichier distant le plus récent :

    Tout ça à cause d'une horloge mal réglée...
    Je comprends pas, je compare les dates de modifications des fichiers, en aucun cas l'heure système ne rentre en jeu. Même si l'heure du serveur distant est incorrecte, d'accord le fichier aura une heure incorrecte mais vu que je copie ce même fichier donc logiquement avec les mêmes infos de modification, ça devrait marcher.

    Ma comparaison porte sur la date/heure de modification.
    Sinon, il y a un truc qui m'échappe .
    http://stef-le-buffle.labrute.com

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Je comprends pas, je compare les dates de modifications des fichiers, en aucun cas l'heure système ne rentre en jeu
    Si, justement : l'heure de modification est renseignée par le système où se trouve le fichier, pas par celui qui le modifie.

  15. #15
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Si, justement : l'heure de modification est renseignée par le système où se trouve le fichier, pas par celui qui le modifie.
    j'ai trouvé c'est ma procédure de copie qui déconne, je te montre le code pour voir si tu trouves un bug

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    private void CopyDir(string sourceDir, string destDir)
    {
    try
    {
    DirectoryInfo dir = newDirectoryInfo(sourceDir); if (dir.Exists)
    {
    string realDestDir;
    if (dir.Root.Name != dir.Name)
    {
    realDestDir = Path.Combine(destDir, dir.Name);
    if (!Directory.Exists(realDestDir))
    Directory.CreateDirectory(realDestDir);
    }
    else realDestDir = destDir;
    foreach (string d inDirectory.GetDirectories(sourceDir))
     
    CopyDir(d, realDestDir);
     
    foreach (string file inDirectory.GetFiles(sourceDir))
    {
    string fileNameDest = Path.Combine(realDestDir, Path.GetFileName(file));
    //if (!File.Exists(fileNameDest))
    try
    {
    // on v‚rifie si on doit copier le fichier
    if (File.GetLastWriteTime("@" + file) > File.GetLastWriteTime("@" + fileNameDest))
    {
     
    File.Copy(file, fileNameDest, true);
    MessageBox.Show(file + " " + File.GetLastWriteTime(fileNameDest).ToString());
    }
    }
    catch (Exception e)
    {
    // \\192.3.4.17\e\TABLES
    // \\192.3.4.250\share\Steph\Sauvegarde_AfterSav_test
    }
    }
    }
    }
    catch
    {
    // en erreur un dossier n'a pas ‚t‚ renseign‚
    // etat.Add(DateTime.Now.ToLongTimeString() + " : Chemin d'acc‚s manquant.");
    }
    }
    j'ai essayé ma comparaison hors de cette procédure avec un des fichiers en question et là ça marche, c'est pour ça que la met en cause.
    http://stef-le-buffle.labrute.com

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Là comme ça je ne vois pas exactement ce qui ne va pas, mais il y a des choses bizarres... genre tes manipulations sur les Path, j'ai l'impression que tu te compliques la vie.
    Et c'est quoi ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File.GetLastWriteTime("@" + file)
    A quoi sert le "@" ???

    Voilà comment j'aurais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
            public void CopyDir(string source, string destination)
            {
                // Création du répertoire de destination s'il n'existe pas
                if (!Directory.Exists(destination))
                    Directory.CreateDirectory(destination);
     
                // Copie récursive de chaque sous-répertoire
                foreach (string subDir in Directory.GetDirectories(source))
                {
                    // Construction du nom du répertoire de destination
                    DirectoryInfo subDirInfo = new DirectoryInfo(subDir);
                    string destSubDir = Path.Combine(destination, subDirInfo.Name);
                    // Copie
                    CopyDir(subDir, destSubDir);
                }
     
                // On copie les fichiers
                foreach (string sourceFile in Directory.GetFiles(source))
                {
                    // Construction du nom du fichier de destination
                    FileInfo sourceFileInfo = new FileInfo(sourceFile);
                    string destFile = Path.Combine(destination, sourceFileInfo.Name);
                    if (!File.Exists(destFile) || File.GetLastWriteTime(sourceFile) > File.GetLastWriteTime(destFile))
                    {
                        File.Copy(sourceFile, destFile, true);
                    }
                }
     
            }
    (reste juste à ajouter la gestion des exceptions)

    Si ça ne marche toujours pas, essaie d'exécuter pas-à-pas pour regarder ce qui se passe

  17. #17
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Merci beaucoup, je vais tester ton code.
    Je te tiens au courant.
    http://stef-le-buffle.labrute.com

  18. #18
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Ton code donne le même résultat. Il marche chez toi ?
    Je ne vois vraiment pas pourquoi ça ne marche pas, ce qui est étrange c'est le fait que ça ne le fasse pas sur tous les fichiers.
    http://stef-le-buffle.labrute.com

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    A vrai dire je n'ai pas testé ce code... mais les tests que j'ai faits sur GetLastWriteTime m'ont semblé concluants.
    Essaie de voir si tes fichiers qui posent problème n'ont pas une particularité... sinon je ne vois pas

  20. #20
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par tomlev Voir le message
    A vrai dire je n'ai pas testé ce code... mais les tests que j'ai faits sur GetLastWriteTime m'ont semblé concluants.
    Essaie de voir si tes fichiers qui posent problème n'ont pas une particularité... sinon je ne vois pas
    ok, je vais voir ça mais je doute qu'il aient une particularité.
    http://stef-le-buffle.labrute.com

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/01/2015, 07h29
  2. Lire et modifier les propriétés des fichiers Office
    Par SilkyRoad dans le forum Contribuez
    Réponses: 4
    Dernier message: 18/09/2006, 22h25
  3. Réponses: 7
    Dernier message: 07/01/2006, 15h18
  4. Réponses: 24
    Dernier message: 07/12/2005, 10h37
  5. [VB6] Ecrire/Modifier/Effacer ds un fichier text-4 Chs/Lg
    Par Jonathan_Korvitch dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 24/12/2002, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo