2008-10-31 9 views
3

Il semble que Directory.GetFiles() en C# modifie la date de dernier accès d'un fichier. J'ai googlé pendant des heures et ne peut pas sembler trouver un travail autour de cette question. Est-il possible de conserver tous les attributs MAC (Modified, Accessed, Created) d'un fichier? J'utilise Directory.GetDirectories(), Directory.GetFiles() et FileInfo.Directory.GetFiles garder la dernière fois d'accès

En outre, le fi.LastAccessTime donne des résultats étranges - la date est correcte, cependant, le temps est hors de 2 minutes, ou quelques heures.

Time of function execution: 10/31/2008 8:35 AM 

Program Shows As    Last Access Time 
0_PDFIndex.html    - 10/31/2008 8:17:24 AM 
AdvancedArithmetic.pdf  - 10/31/2008 8:31:05 AM 
AdvancedControlStructures.pdf - 10/30/2008 1:18:00 PM 
AoAIX.pdf      - 10/30/2008 1:18:00 PM 
AoATOC.pdf     - 10/30/2008 12:29:51 PM 
AoATOC2.pdf     - 10/30/2008 1:18:00 PM 

Actual      Last Access Time 
0_PDFIndex.html    - 10/31/2008 8:17 AM 
AdvancedArithmetic.pdf  - 10/30/2008 12:29 PM 
AdvancedControlStructures.pdf - 10/30/2008 12:29 PM 
AoAIX.pdf      - 10/30/2008 12:29 PM 
AoATOC.pdf     - 10/30/2008 12:29 PM 
AoATOC2.pdf     - 10/30/2008 12:29 PM 

Voici la méthode que j'utilise. Si vous avez besoin de plus d'informations, s'il vous plaît faites le moi savoir.

Merci!

public void PopulateTreeView(string directoryValue, ref TreeNode parentNode) 
     { 
      string[] directoryArray = Directory.GetDirectories(directoryValue); 
      string[] fileArray = Directory.GetFiles(directoryValue, "*.*", SearchOption.AllDirectories); 

      try 
      { 
       #region Directories 
       if (directoryArray.Length != 0) 
       { 
        foreach (string directory in directoryArray) 
        { 
         DirectoryInfo di = new DirectoryInfo(directory); 

         TreeNode dirNode = parentNode.Nodes.Add(di.Name); 

         FileNode fn = new FileNode(); 
         fn.bIsDir = true; 
         fn.dir = di; 

         dirNode.Tag = fn; 
         PopulateTreeView(directory, ref dirNode); 
         Application.DoEvents(); 

        } 
       } 
       #endregion 

       #region Files 
       if (fileArray.Length != 0) 
       { 
        foreach (string file in fileArray) 
        { 
         FileInfo fi = new FileInfo(file); 

         TreeNode fileNode = parentNode.Nodes.Add(fi.Name); 
         FileNode fn = new FileNode(); 
         fn.bIsDir = false; 
         fn.file = fi; 

         fileNode.Tag = fn; 

         fileNode.ImageIndex = 1; 

         Console.WriteLine(fi.Name + " - " + fi.LastAccessTime); 

        } 
       } 
       #endregion 

      } 
      catch (UnauthorizedAccessException) 
      { 
       parentNode.Nodes.Add("Access denied"); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
      finally 
      { 
       Application.DoEvents(); 
      } 
     } 

Je sais que les différences entre les attributs. Ce dont j'ai besoin c'est que le fichier reste exactement le même que tous les attributs et les méta-données, comme si mon programme ne touchait jamais le fichier; cela inclut la dernière date d'accès.

Répondre

5

Je sais ce qui est loin d'être idéale, mais u peut utiliser fsutil (fourni avec Windows) pour désactiver la dernière écriture de temps d'accès:

fsutil behavior set disablelastaccess 1 

On peut supposer que vous aviez le remettre à 0 une fois fait. Vous pouvez l'appeler en utilisant Process.Start à partir de C#, mais il doit y avoir un meilleur moyen de programmation (en appelant l'API Windows).

Process.Start("fsutil", "behavior set disablelastaccess 1").WaitForExit(); 

Notez que cette façon est un paramètre global Windows et affecterait également l'accès au disque de l'extérieur de votre application ...

+1

La documentation de FSUTIL note que "la plupart de ces options nécessitent un redémarrage pour qu'il prenne effet". – GalacticCowboy

1

Les temps d'accès sont différents des derniers temps d'écriture. Si vous utilisez fi.LastWriteTime, je pense que vous trouverez que les heures sont les mêmes affichées dans la fenêtre de l'explorateur ou de la cmd.

Bien sûr, le dernier accès et dernière écriture pourrait être le même, mais ils ne sont pas nécessairement les mêmes.

0

Je ne sais pas si cela est lié ou non, mais de MSDN:

lors du premier appel, FileSystemInfo appels Actualiser et renvoie la en cache des informations sur les API pour obtenir les attributs et ainsi de suite. Lors des prochains appels, vous devez appeler Actualiser pour obtenir la dernière copie des informations.

BTW, "LastAccessTime" vous indique essentiellement la dernière fois que vous avez "regardé" le fichier. En l'absence de données obsolètes, ce serait toujours "maintenant" ... Pas particulièrement utile, à mon humble avis.

0

Le temps d'accès afficherait un marqueur en lecture seule, la dernière écriture indiquerait le fichier en cours de modification.

1

(Republier cela comme une réponse plutôt qu'un commentaire ...)

J'ai simplement exécuter ce bout de code ici, et il a quitté le dernier seul temps d'accès - Je ne peux pas reproduire le problème que vous 'voyons, donc Directory.GetFiles n'est pas cassé 100% du temps.

Filemon peut vérifier si une autre application fait ceci: http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx

0

Je ne l'ai pas essayé, mais Google suggère:

Disable the NTFS Last Access Time Stamp

Il est un changement de système, donc il faut savoir

+0

C'est probablement ce que fait aussi FSUTIL (suggéré par dbkk). – GalacticCowboy

+0

oui, il modifie la même entrée de registre. est-il possible de le faire sans redémarrer? –

0

Si vous accédez au disque à des fins médico-légales, alors vous devriez le faire avec l'ensemble du disque dur protégé en écriture au niveau matériel (et donc ce n'est pas vraiment une question de programmation) n).

Une recherche Google pour hdd "write protect" vous révélera beaucoup de solutions potentielles.

1

Si vous faites de la médecine légale et que vous ne voulez pas que le disque soit modifié, pourquoi le montez-vous en mode inscriptible? Vous devriez y accéder en lecture seule pour garantir que vous ne changez pas accidentellement quelque chose. En outre, j'espère que vous n'exécutez pas votre programme dans le système d'exploitation de la personne sur le disque que vous examinez ... vous venez d'ajouter le disque à une machine que vous contrôlez, n'est-ce pas?

+0

ce n'est pas pour un "cas médico-légal". les données sont une copie de l'original - c'est un utilitaire que nous envoyons à nos clients. donc nous ne pouvons pas mettre leurs lecteurs à protéger en écriture. –

Questions connexes