MoveFileEx无法正常工作?

Chi*_*ata 2 c# 64-bit pinvoke winapi

我尝试了几种方法让MoveFileEx使用DELAY_UNTIL_REBOOT标志而没有成功.注册表中的FileRenameOperations键还显示该方法未正确执行.可能是什么原因?

我这样调用我的MoveFileEx函数:

MoveFileEx(localFile, oldFile, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
Run Code Online (Sandbox Code Playgroud)

我的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
}
Run Code Online (Sandbox Code Playgroud)

此应用程序在管理员帐户下运行.这可能是因为我使用的是4而不是0x4或者是64位问题吗?谢谢!

编辑:操作返回false,错误代码为3.

Dav*_*nan 5

错误代码3是ERROR_PATH_NOT_FOUND.您似乎在文件名中犯了一个简单的错误:其中一个文件名中的一个目录不存在.

在评论中,您声明失败的调用具有以下形式:

MoveFileEx(newFile, "", 4);
Run Code Online (Sandbox Code Playgroud)

这肯定会失败.您要做的是传递NULL目标文件名以删除文件.但是你没有通过NULL,你正在传递空字符串.要传递NULL给本机API,请按以下方式调用它:

bool res = MoveFileEx(filename, null,
    MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
Run Code Online (Sandbox Code Playgroud)

我会确保你包括SetLastError = true在你的pinvoke中,以便你可以诊断错误.

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern bool MoveFileEx(string lpExistingFileName, 
    string lpNewFileName, MoveFileFlags dwFlags);
Run Code Online (Sandbox Code Playgroud)