我想P/Invoke SetFileTime,但我似乎无法得到它的工作。它总是返回一个错误代码5(拒绝访问),我不知道为什么。这里是我使用的代码:SetFileTime返回错误代码5
void Main()
{
var pointer = CreateFile(@"C:\Users\User\Desktop\New folder\New Text Document.txt", FileAccess.ReadWrite, FileShare.None, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
Console.WriteLine(pointer);
var now = DateTime.Now.ToFileTime();
long lpCreationTime = now;
long lpLastAccessTime = now;
long lpLastWriteTime = now;
if (!SetFileTime(pointer, ref lpCreationTime, ref lpLastAccessTime, ref lpLastWriteTime))
Console.WriteLine(GetLastError());
CloseHandle(pointer);
}
[DllImport("kernel32.dll")]
static extern UInt32 GetLastError();
[DllImport("kernel32.dll", SetLastError = true)]
static extern Boolean SetFileTime(IntPtr hFile, ref long lpCreationTime, ref long lpLastAccessTime, ref long lpLastWriteTime);
[DllImport("kernel32.dll", SetLastError = true)]
static extern Boolean CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern IntPtr CreateFile(String fileName, [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess, [MarshalAs(UnmanagedType.U4)] FileShare fileShare, IntPtr securityAttributes, [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, [MarshalAs(UnmanagedType.U4)] FileAttributes flags, IntPtr template);
我的指针是有效的(2376),但我看到SetFileTime已经失败,返回(拒绝访问)的错误代码5。现在,我确保我以管理员身份运行,并且我的帐户拥有该路径的权限,但仍然没有雪茄。任何人有任何想法,为什么发生这种情况?
更新
Marshal.GetLastWin32Error()
还调用SetFileTime
后返回5。另外,我需要使这个调用工作,以便我可以在Windows的长路径上运行SetFileTime
,该路径支持CreateFile
,但当前的.NET文件库不支持Windows中的长路径。
@Alexandru你有没有想过做一个谷歌搜索上你试图“调用/调用SetFileTime”的方法 – MethodMan
@MethodMan是的,我不会问我没有。我完全阅读了它的API文档。 – Alexandru
还有更多的资源/例子超出'API' – MethodMan