我在CSharp代码中使用了上面提到的方法,因为它非常方便.但是很明显,当一个文件被替换时,UI中有一个bug.

var fileOri = @"D:\Temp\overwritetest_ori.txt";
var fileToOverwrite = @"D:\Temp\overwritetest\overwritetest.txt";
FileSystem.MoveFile(fileOri, fileToOverwrite, UIOption.AllDialogs, UICancelOption.DoNothing);

当文件D:\Temp\overwritetest\overwritetest.txt存在时,该对话框显示如下:

FileOverwriteDialog

现在,这是一个错误,还是我使用的代码不是它应该是的?

对话框显示"目标已经有一个名为"overwritetest_ori.txt "的文件",这不是真的.只有一个文件"overwritetest.txt",它恰好是移动操作的目标名称.所以对话框的文本应该是"目标已经有一个名为"overwritetest.txt"的文件.

推荐答案

这绝对是the Windows SHFileOperation API中的bug,而不是FileSystem.MoveFile()中的bug,下面的代码可以证明.

如果你按照OP的问题运行下面的代码,文件已经到位,那么你会得到相同的消息框:

using System;
using System.Runtime.InteropServices;

namespace Console1;

public static class Program
{
    static void Main()
    {
        var fileOri         = @"D:\Temp\overwritetest_ori.txt";
        var fileToOverwrite = @"D:\Temp\overwritetest\overwritetest.txt";

        SHFileOperationApi.MoveFile(fileOri, fileToOverwrite);
    }
}

public static class SHFileOperationApi
{
    const int FO_MOVE = 0x1;
    const int FOF_ALLOWUNDO = 0x40;
    const int FOF_WANTNUKEWARNING = 0x4000;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    struct SHFILEOPSTRUCT
    {
        public IntPtr hwnd;
        public int wFunc;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pFrom;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pTo;
        public ushort fFlags;
        public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpszProgressTitle;
    }

    [DllImport("shell32.dll", CharSet = CharSet.Unicode)]
    static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);

    public static void MoveFile(string sourceFile, string destinationFile)
    {
        var fileOpStruct = new SHFILEOPSTRUCT {
            hwnd = IntPtr.Zero,
            wFunc = FO_MOVE,
            pFrom = sourceFile + "\0",
            pTo = destinationFile + "\0", // Double-null terminated
            fFlags = FOF_ALLOWUNDO | FOF_WANTNUKEWARNING
        };

        SHFileOperation(ref fileOpStruct);
    }
}

提供:

The error message

Csharp相关问答推荐

PredicateBuilder不是循环工作,而是手动工作

EF Core Fluent API中定义的多对多关系

从Blob存储中提取tar.gz文件并将提取结果上载到另一个Blob存储

如何在Parall.ForEachAsync中使用CancerationTokenSource

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

MS Graph v5.42.0:在寻呼消息时更改页面大小

尽管保证密钥不同,但已添加相同密钥的项(&Q;)

显示文档的ECDsa签名PDF在Adobe Reader中签名后已被更改或损坏

如何让两个.NET版本不兼容的项目对话?

如何更改新创建的实例的变量?

在使用UserManager时,如何包含与其他实体的关系?

如何在GRPC代码First服务的返回类型上使用多态性?

如何从另一个类的列表中按ID取值

如何在Akka.NET中重新启动执行元时清除邮箱

WPF动态设置弹出窗口水平偏移

Blazor:搜索框在第一次搜索时不搜索

错误:此版本的Visual Studio无法打开以下项目

无法通过服务控制台启动.NET Core 6.0服务(错误1053)

使用ImmutableList时,DynamicData未按预期工作

更新实体框架上的被跟踪实体