2008-10-31 1 views
3

Похоже, что Directory.GetFiles() в C# изменяет дату последнего доступа к файлу. Я часами работаю в Интернете и не могу найти работу по этой проблеме. В любом случае, чтобы сохранить все атрибуты MAC (измененные, доступные, созданные) файла? Я использую Directory.GetDirectories(), Directory.GetFiles() и FileInfo.Directory.GetFiles, сохраняющий последнее время доступа

Кроме того, fi.LastAccessTime дает странные результаты - дата правильна, однако, время от 2 минуты, или несколько часов.

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 

Ниже приведен метод, который я использую. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо!

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(); 
      } 
     } 

я знаю, различия между атрибутами. Мне нужно, чтобы файл оставался одним и тем же всеми атрибутами и метаданными, как если бы моя программа никогда не касалась файла; это включает в себя последнюю дату доступа.

ответ

5

Я знаю, что это далеко от идеала, но и можно использовать FSUTIL (поставляется с Windows), чтобы отключить последнее время доступа записи:

fsutil behavior set disablelastaccess 1 

Предположительно вы бы установить его обратно в 0, когда сделано. Вы можете вызывать это с помощью Process.Start с C#, но должен быть лучший программный способ (вызов в Windows API).

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

Обратите внимание, что это глобальная настройка Windows, а также влияет на доступ к диску из-за ваше приложение ...

+1

Документация FSUTIL отмечает, что «для большинства из этих параметров требуется перезагрузка, чтобы она вступила в силу». – GalacticCowboy 2008-10-31 14:35:11

1

Времени доступа отличается от последних времен записи. Если вы используете fi.LastWriteTime, я думаю, вы обнаружите, что время одинаково отображается в проводнике или в окне cmd.

Конечно, последний доступ и последняя запись могут быть одинаковыми, но они не обязательно одинаковы.

0

Не уверен, если это связано или нет, но из MSDN:

При первом вызове, FileSystemInfo вызовы Refresh и возвращает кэшированные информацию о API, чтобы получить на атрибуты и так далее. При последующих звонках вы должны позвонить в службу «Обновить», чтобы получить последнюю информацию об .

BTW, «LastAccessTime» в основном говорит вам, что в последний раз, когда вы «посмотрели» на файл. В отсутствие устаревших данных это всегда будет «сейчас» ... Не особенно полезно, ИМХО.

0

Время доступа покажет маркер только для чтения, последняя запись будет показывать файл, который будет изменен.

1

(перепроведении это как ответ, а не комментарий ...)

Я просто запустить этот фрагмент кода здесь, и это осталось время последнего доступа в одиночку - я не могу воспроизвести проблему, которую вы «видеть», поэтому Directory.GetFiles не нарушается в 100% случаев.

Filemon может проверить, является ли делать некоторые другие приложения это: http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx

0

Я не пробовал это, но Google предлагает:

Disable the NTFS Last Access Time Stamp

Это общесистемное изменение, так что надо знать из этого ...

+0

Это, вероятно, то, что делает FSUTIL (предложенный dbkk). – GalacticCowboy 2008-10-31 14:33:37

+0

Да, он изменяет одну и ту же запись в реестре. есть ли способ сделать это без перезагрузки? – 2008-10-31 15:39:31

0

Если вы получаете доступ к диску для судебных целей, вам действительно нужно делать это со всем жестким диском, защищенным от записи на аппаратном уровне (и, следовательно, это не является программным заданием п).

Поиск в Google для hdd "write protect" покажет много потенциальных решений.

1

Если вы делаете экспертизу, и вы не хотите, чтобы диск был изменен, почему вы его монтируете в режиме записи? Вы должны получать доступ к нему только для чтения, чтобы гарантировать, что вы не случайно меняете что-то. Кроме того, я надеюсь, что вы не используете свою программу в ОС того человека, на диске которого вы изучаете ... вы только что добавили диск на машину, которую вы контролируете, не так ли?