Ale*_*dru 3 c# io pinvoke file kernel32
我正在尝试P /调用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);
Run Code Online (Sandbox Code Playgroud)
我的指针是有效的(2376),但我看到SetFileTime失败并返回了错误代码5(访问被拒绝)。现在,我已确保以管理员身份运行,并且我的帐户具有该路径的权限,但仍然没有雪茄。任何人都知道为什么会这样吗?
更新资料
Marshal.GetLastWin32Error()呼叫后,也会传回5 SetFileTime。另外,我需要使此调用起作用,以便可以SetFileTime在CreateFile支持Windows的长路径上使用,但是.NET的当前文件库在Windows中不支持长路径。
从以下文档中SetFileTime:
文件或目录的句柄。必须使用具有FILE_WRITE_ATTRIBUTES访问权限的CreateFile函数创建该句柄。
您的代码无法做到这一点。.net FileAccess枚举与Win32访问标志不兼容。您需要定义一个专门用于的枚举CreateFile。同样,您对FileShare和的使用FileMode也不正确。
此p / invoke声明应足够:http : //www.pinvoke.net/default.aspx/kernel32.createfile
正如Alexei所说,不要调用,GetLastError因为您可能正在为框架调用选择错误代码,而不是真正的错误。使用SetLastError = true和Marshal.GetLastWin32Error()。
如果,您也无法检查返回值中的错误CreateFile。
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |