我想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