Microsoft.VisualBasic.FileIO.FileSystem.MoveFile() 对话框中的错误?

问题描述 投票:0回答:1

我在我的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”的文件。

c# vb.net
1个回答
0
投票

这绝对是 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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.