如何在不影响“最后写入时间”的情况下更改文件

4

我想将一些内容写入文件,例如

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

然而,这会更改"上次写入时间"。稍后我可以通过使用

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

但与此同时,FileSystemWatcher 已经被触发。

现在我的问题是:是否有可能在不改变“最后写入时间”的情况下编写文件?


3
你真的真的真的想要那个吗?实际上,你正在向文件写入内容。相反,你可以暂停FileSystemWatcher(它已经不可靠),这样你就不必处理虚假的写入时间。 - JustAnotherUserYouMayKnow
我不这么认为!除非你替换底层驱动程序 :P :) ! - Parimal Raj
@JustAnotherUserYouMayKnow:FileSystemWatcher 不一定在我的控制之下。/ - tanascius
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

谢谢您的建议。看起来是一个可能的解决方案,但不幸的是,到目前为止,我还无法使其工作。一旦我了解更多情况,我会提供反馈。 - tanascius

2

我不认为这是可能的,也没有意识到这一点。

此外,请注意,“最后写入时间”并不总是更新,如果你要基于该参数从文件夹中选择(例如)某些文件或以某种方式依赖该属性,将导致一些奇怪的结果。因此,在开发中不能依赖该参数,由于操作系统的架构,它不可靠。

只需创建一个标志:boolean,如果您在同一应用程序中编写和查看,则可以这样做,或者创建一个flag,例如某个特定命名的文件,如果您从另一个应用程序编写并查看。


谢谢你的回答。我无法使用标志或文件,因为带有FileSystemWatcher的应用程序不在我的控制之下。 - tanascius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接