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);
}
式中:options
为MoveFileOptions.MOVEFILE_COPY_ALLOWED
在硬盘驱动器中移动时工作正常。但当我尝试移动到闪存驱动器时,我得到:The system cannot move the file to a different disk drive
。
为什么?
您的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必须在同一驱动器上。