编程语言
首页 > 编程语言> > c# – 如何在不影响“上次写入时间”的情况下更改文件

c# – 如何在不影响“上次写入时间”的情况下更改文件

作者:互联网

我想写一些文件,比如

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

但是,这会改变“last write time”.我可以稍后通过使用重置它

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

但与此同时,FileSystemWatcher已经触发.

现在我的问题是:是否可以在不改变“上次写入时间”的情况下编写文件?

解决方法:

您可以通过在Kernel32.dll中使用P / Invoke调用来实现它.

MS TechNet的This Powershell script实现了它,并明确声明不触发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

标签:c,timestamp,file-io,filesystemwatcher
来源: https://codeday.me/bug/20190529/1178795.html