3

C# の Directory.GetFiles() は、ファイルの最終アクセス日を変更するようです。私は何時間もグーグルで検索しましたが、この問題の回避策が見つからないようです。ファイルのすべての MAC (変更、アクセス、作成) 属性を保持する方法はありますか? 私は Directory.GetDirectories()、Directory.GetFiles()、および FileInfo を使用しています。

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

属性の違いがよくわかりました。私が必要とするのは、私のプログラムがファイルに触れていないかのように、ファイルがすべての属性とメタデータをまったく同じままにすることです。これには、最終アクセス日が含まれます。

4

8 に答える 8

5

これが理想とはほど遠いことは承知していますが、fsutil (Windows に付属) を使用して最終アクセス時刻の書き込みを無効にすることができます。

fsutil behavior set disablelastaccess 1

おそらく、完了したら0に戻すでしょう。これは、C# から Process.Start を使用して呼び出すことができますが、より適切なプログラムによる方法 (Windows API への呼び出し) が必要です。

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

これはグローバルな Windows 設定であり、アプリの外部からのディスク アクセスにも影響することに注意してください...

于 2008-10-31T13:28:37.363 に答える
1

アクセス時間は前回の書き込み時間とは異なります。fi.LastWriteTimeを使用する場合、エクスプローラーまたはcmdウィンドウに表示される時間は同じであることがわかると思います。

もちろん、最後のアクセスと最後の書き込みは同じである可能性がありますが、必ずしも同じである必要はありません。

于 2008-10-31T13:52:23.820 に答える
1

(これをコメントではなく返信として再投稿します...)

ここでこのコード スニペットを実行したところ、最後のアクセス時刻だけが残されています。表示されている問題を再現できないため、Directory.GetFiles は 100% 壊れているわけではありません。

Filemon は、他のアプリがこれを行っているかどうかを確認できます: http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx

于 2008-10-31T14:14:08.253 に答える
1

フォレンジックを行っていて、ドライブを変更したくない場合、なぜ書き込み可能モードでマウントしているのですか? 誤って何かを変更していないことを保証するために、読み取り専用でアクセスする必要があります。また、あなたが調べているディスクの人の OS でプログラムを実行していないことを願っています...あなたが制御するマシンにディスクを追加したばかりですよね?

于 2008-10-31T15:39:51.670 に答える
0

これが関連しているかどうかはわかりませんが、MSDNから:

FileSystemInfoは、最初に呼び出されると、Refreshを呼び出し、APIにキャッシュされた情報を返し、属性などを取得します。以降の呼び出しでは、Refreshを呼び出して、情報の最新のコピーを取得する必要があります。

ところで、「LastAccessTime」は基本的に、ファイルを最後に「見た」時間を示します。古いデータがない場合、これは常に「今」です...特に有用ではありません、私見。

于 2008-10-31T13:54:49.603 に答える
0

アクセス時間には読み取り専用マーカーが表示され、最後の書き込みには変更中のファイルが表示されます。

于 2008-10-31T14:02:36.313 に答える
0

私はこれを試していませんが、Google は次のように提案しています。

NTFS 最終アクセス タイム スタンプを無効にする

これはシステム全体の変更ですので、そのことに注意してください...

于 2008-10-31T14:22:41.967 に答える
0

フォレンジック目的でディスクにアクセスする場合は、ハード ディスク全体をハードウェア レベルで書き込み保護してアクセスする必要があります (したがって、これは実際にはプログラミングの問題ではありません)。

を Google で検索すると、hdd "write protect"多くの潜在的な解決策が明らかになります。

于 2008-10-31T14:31:25.957 に答える