MoveFileWithProgress抛出“系统无法将文件移动到其他磁盘驱动器”;——为什么

本文关键字:其他 磁盘驱动器 为什么 移动 文件 抛出 系统 MoveFileWithProgress | 更新日期: 2023-09-27 18:18:42

我有:

[SuppressUnmanagedCodeSecurity]
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool MoveFileWithProgress(
    string lpExistingFileName, string lpNewFileName,
    CopyProgressRoutine lpProgressRoutine,
    int dwFlags);
public enum MoveFileOptions 
{
    MOVEFILE_COPY_ALLOWED = 0x2
}

并使用:

if (!MoveFileWithProgress(source.FullName, destination.FullName, cpr, (int)options)) {
  throw new IOException(new Win32Exception().Message);
}

式中:optionsMoveFileOptions.MOVEFILE_COPY_ALLOWED

在硬盘驱动器中移动时工作正常。但当我尝试移动到闪存驱动器时,我得到:The system cannot move the file to a different disk drive

为什么?

MoveFileWithProgress抛出“系统无法将文件移动到其他磁盘驱动器”;——为什么

您的DllImport不正确。你的函数只有4个参数,但实际函数有5个。可能发生的事情是MOVEFILE_COPY_ALLOWED被传递给lpData并被忽略。dwFlags参数就是堆栈中恰好存在的值。

修复你的p/调用可能会解决问题。另外,dwFlags应该是无符号的。

[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool MoveFileWithProgress(
    string lpExistingFileName,
    string lpNewFileName,
    CopyProgressRoutine lpProgressRoutine,
    IntPtr lpData,
    uint dwFlags
);

正确后,您需要决定传递给lpData的内容。既然您现在似乎没有使用它,那么这并不重要,IntPtr.Zero似乎是显而易见的选择。

从这个Microsoft | Technet页面,它说:

使用重命名命令重命名文件时,不能将文件移动到另一个磁盘驱动器。

移动文件前尝试重命名。

您是否正在移动一个目录?

根据MSDN上MoveFileWithProgress的文档(强调添加):

移动文件时,lpNewFileName可以位于不同的文件系统或卷上。如果lpNewFileName在另一个驱动器上,则必须在dwFlags中设置MOVEFILE_COPY_ALLOWED标志。

移动目录时,lpExistingFileName和lpNewFileName必须在同一驱动器上。