MoveFileWithProgress 抛出“系统无法将文件移动到不同的磁盘驱动器” –为什么?

发布于 2024-12-22 08:25:40 字数 728 浏览 1 评论 0原文

我有:

[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

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

为什么?

I have:

[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
}

And calling it with:

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

Where: options is MoveFileOptions.MOVEFILE_COPY_ALLOWED

It works fine when moving in the hard drive. But when I try moving to a Flash-drive, I get: The system cannot move the file to a different disk drive.

Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凉宸 2024-12-29 08:25:40

您的 DllImport 不正确。您的函数只有 4 个参数,但是 真实函数 有 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 似乎是显而易见的选择。

Your DllImport is incorrect. Your function has only 4 parameters, but the real function has 5. Presumably what is happening is that MOVEFILE_COPY_ALLOWED is being passed to lpData and is ignored. The dwFlags parameter is just whatever happens to be sitting on the stack.

Fixing your p/invoke will probably solve the problem. Also, dwFlags should be unsigned.

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

With this correct you need to decide what to pass to lpData. Since you appear not to be using it at the moment, it doesn't really matter and IntPtr.Zero seems the obvious choice.

别挽留 2024-12-29 08:25:40

从这个 Microsoft | Technet 页面上写着:

使用“重命名”命令重命名文件的同时,无法将文件移至其他磁盘驱动器。

在移动文件之前尝试重命名该文件。

From this Microsoft | Technet page, it says:

The file cannot be moved to a different disk drive at the same time you rename it using the Rename command.

Try renaming the file before moving it.

情愿 2024-12-29 08:25:40

您可能要移动目录吗?

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

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

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

Are you perhaps moving a directory?

According to the documentation for MoveFileWithProgress at MSDN (emphasis added):

When moving a file, lpNewFileName can be on a different file system or volume. If lpNewFileName is on another drive, you must set the MOVEFILE_COPY_ALLOWED flag in dwFlags.

When moving a directory, lpExistingFileName and lpNewFileName must be on the same drive.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文