我在我的CSharp代码中使用了上面提到的方法,因为它真的很方便。但显然,当要替换文件时,UI 中存在错误。
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
存在时,对话框显示:
这是一个错误还是我使用的代码不是应该的样子?
对话框显示“目标已经有一个名为“overwritetest_ori.txt”的文件”,这不是真的。只有一个文件“overwritetest.txt”恰好是移动操作的目标名称。因此对话框的文本应该是“目标已经有一个名为“overwritetest.txt”的文件。
这绝对是 Windows
SHFileOperation
API 中的错误,而不是 FileSystem.MoveFile()
中的错误,如下面的代码所示。
如果您根据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);
}
}