4

次のように、ファイルにいくつかのものを書きたいと思います

using( var fs = File.OpenWrite( file ) )
{
  fs.Write( bytes, 0, bytes.Length );
}

ただし、これにより「最終書き込み時刻」が変更されます。を使用して、後でリセットできます

File.SetLastWriteTime( file, <old last write time> );

しかし、それまでの間、FileSystemWatcherは既にトリガーされています。

今私の質問:「最終書き込み時間」を変更せずにファイルを書き込むことは可能ですか?

4

2 に答える 2

4

これは、Kernel32.dll で P/Invoke 呼び出しを使用して実現できます。

MS TechNet のこの Powershell スクリプトFileSystemWatcherはそれを実現し、のイベントがトリガーされないことを明示的に示しています。

スクリプトを簡単に調べてみましたが、コードは非常に単純で、C# プロジェクトに簡単にコピーできます。

宣言:

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetFileTime(IntPtr hFile, ref long lpCreationTime, ref long lpLastAccessTime, ref long lpLastWriteTime);

スクリプトはSetFileTime、書き込み前にファイル時間をロックするために使用します。

private const int64 fileTimeUnchanged = 0xFFFFFFFF;

この定数は、lpCreationTime、lpLastAccessTime、および lpLastWriteTime のメソッドへの参照として渡されます。

// assuming fileStreamHandle is an IntPtr with the handle of the opened filestream
SetFileTime(fileStreamHandle, ref fileTimeUnchanged, ref fileTimeUnchanged, ref fileTimeUnchanged);
// Write to the file and close the stream
于 2013-04-09T14:09:15.327 に答える