这绝对是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);
}
}
提供: