文件可以有更改日期。该日期与上次修改日期或上次访问日期不同。更改日期通过 UI 或 .NET API 不可见。有两个 Win32 函数通过HandleEx获取文件信息 http://msdn.microsoft.com/en-us/library/windows/desktop/aa364953(v=vs.85).aspx用于阅读和通过句柄设置文件信息 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365539(v=vs.85).aspx用于写入文件信息。
我想读出更改日期,添加一些小时,然后将新日期写回作为文件的更改日期。
现在我有以下代码:
class Program
{
static void Main(string[] args)
{
using (var file = new FileStream(@"c:\path\to\file", FileMode.Open))
{
var fileInfo = new FILE_BASIC_INFO();
GetFileInformationByHandleEx(
file.Handle,
FILE_INFO_BY_HANDLE_CLASS.FileBasicInfo,
out fileInfo,
(uint)Marshal.SizeOf(fileInfo));
SetFileInformationByHandle(
file.Handle,
FILE_INFO_BY_HANDLE_CLASS.FileBasicInfo,
fileInfo,
(uint)Marshal.SizeOf(fileInfo));
}
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool GetFileInformationByHandleEx(
IntPtr hFile,
FILE_INFO_BY_HANDLE_CLASS infoClass,
out FILE_BASIC_INFO fileInfo,
uint dwBufferSize);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetFileInformationByHandle(
IntPtr hFile,
FILE_INFO_BY_HANDLE_CLASS infoClass,
FILE_BASIC_INFO fileInfo,
uint dwBufferSize);
private enum FILE_INFO_BY_HANDLE_CLASS
{
FileBasicInfo = 0
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct FILE_BASIC_INFO
{
public LARGE_INTEGER CreationTime;
public LARGE_INTEGER LastAccessTime;
public LARGE_INTEGER LastWriteTime;
public LARGE_INTEGER ChangeTime;
public uint FileAttributes;
}
[StructLayout(LayoutKind.Explicit, Size = 8)]
private struct LARGE_INTEGER
{
[FieldOffset(0)]
public Int64 QuadPart;
[FieldOffset(0)]
public UInt32 LowPart;
[FieldOffset(4)]
public Int32 HighPart;
}
}
我可以读出那个可怕的结构的更改日期LARGE_INTEGER
。我想要的是一个可以将该类型转换为System.DateTime
反之亦然。
我遇到的第二个问题是 GetFileInformationByHandle 方法的签名错误。我得到一个带有以下附加信息的 PInvokeStackImbalance:
附加信息:对 PInvoke 函数“Program::SetFileInformationByHandle”的调用使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
谁能帮我?