我尝试了几种方法让MoveFileEx使用DELAY_UNTIL_REBOOT标志但没有成功。注册表中的FileRenameOperations键还显示该方法未正确执行。可能是什么原因?
我这样调用我的MoveFileEx函数:
MoveFileEx(localFile, oldFile, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
我的WINAPI代码如下:
[DllImport("kernel32.dll", EntryPoint = "MoveFileEx")]
internal static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);
internal enum MoveFileFlags
{
MOVEFILE_REPLACE_EXISTING = 1,
MOVEFILE_COPY_ALLOWED = 2,
MOVEFILE_DELAY_UNTIL_REBOOT = 4,
MOVEFILE_WRITE_THROUGH = 8
}
此应用程序在管理员帐户下运行。这可能是因为我使用的是4而不是0x4或者是64位问题吗?谢谢!
编辑:操作返回false,错误代码为3。
答案 0 :(得分:5)
错误代码3是ERROR_PATH_NOT_FOUND
。您的文件名似乎出现了一个简单的错误:您的某个文件名中的某个目录不存在。
在评论中,您声明失败的呼叫的格式为:
MoveFileEx(newFile, "", 4);
这肯定会失败。您要做的是将NULL
作为目标文件名传递,以便删除该文件。但是你没有传递NULL
,你传递的是空字符串。要将NULL
传递给本机API,请按以下方式调用它:
bool res = MoveFileEx(filename, null,
MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
我会确保在您的pinvoke中包含SetLastError = true
,以便您可以诊断错误。
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern bool MoveFileEx(string lpExistingFileName,
string lpNewFileName, MoveFileFlags dwFlags);
答案 1 :(得分:0)
您的流程应以管理权限运行。