gpt4 book ai didi

c# - MoveFileWithProgress 抛出 "The system cannot move the file to a different disk drive"– 为什么?

转载 作者:可可西里 更新时间:2023-11-01 09:43:31 33 4
gpt4 key购买 nike

我有:

[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

在硬盘驱动器中移动时它工作正常。但是当我尝试移动到闪存驱动器时,我得到:系统无法将文件移动到不同的磁盘驱动器

为什么?

最佳答案

您的 DllImport 不正确。你的函数只有 4 个参数,但是 real function有 5 个。大概发生的事情是 MOVEFILE_COPY_ALLOWED 被传递给 lpData 并被忽略。 dwFlags 参数就是恰好位于堆栈上的任何内容。

修复您的 p/invoke 可能会解决问题。此外,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 似乎是显而易见的选择。

关于c# - MoveFileWithProgress 抛出 "The system cannot move the file to a different disk drive"– 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8609522/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com