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 脚本实现了它,并明确声明 aFileSystemWatcher的事件不会被触发。

我简要地查看了脚本,代码非常简单,可以轻松复制到您的 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 回答
2

不要认为这是可能的,我也不知道。

还要考虑“最后写入时间”不是总是更新,如果您要根据该参数从文件夹中选择(例如)一些文件或以某种方式依赖该属性,这会导致一些有线结果。因此,它不是您在开发中可以依赖的参数,它只是操作系统架构不可靠。

只需创建一个标志:boolean,如果您将其写入并监视到同一个应用程序中,或者创建一个标志flag,例如某个特定的命名文件,如果您编写表单并从另一个应用程序监视。

于 2013-04-09T14:10:59.543 回答