C# 如果FileToDelete驻留在其他驱动器中,则替换引发异常

C# 如果FileToDelete驻留在其他驱动器中,则替换引发异常,c#,file-io,replace,C#,File Io,Replace,我不确定这是否是它抛出错误的原因。但是对我来说,执行文件的测试失败了。用驻留在不同目录中的文件替换。我只是想知道其他人是否也是这样 [TestMethod] public void TestFileReplaceDifferentDirectory() { string FileToReplace = @"c:\tools\file2.txt"; string FileToDelete = @"D:\DropFolder\file0.txt"; string strTo

我不确定这是否是它抛出错误的原因。但是对我来说,执行
文件的测试失败了。用驻留在不同目录中的文件替换
。我只是想知道其他人是否也是这样

[TestMethod]
public void TestFileReplaceDifferentDirectory()
{
    string FileToReplace = @"c:\tools\file2.txt";
    string FileToDelete = @"D:\DropFolder\file0.txt";

    string strToWrite;
    using (var wtr = File.CreateText(FileToDelete))
    {
        long ticks = DateTime.Now.Ticks;
        strToWrite = string.Join(",", ticks, ticks, ticks);
        wtr.WriteLine(strToWrite);
        wtr.Flush();
        wtr.Close();
    }

    string BackupFileName = Path.Combine(
        Path.GetDirectoryName(FileToReplace),
        string.Format("{0}_{1}{2}",
            Path.GetFileNameWithoutExtension(FileToReplace),
            DateTime.Now.Ticks,
            Path.GetExtension(FileToReplace))
    );

    File.Replace(FileToDelete, FileToReplace, BackupFileName, false);

    using (StreamReader rdr = new StreamReader(FileToReplace))
    {
        string line = rdr.ReadLine();
        Assert.AreEqual(strToWrite, line);
    }
}


[TestMethod]
public void TestFileReplaceSameDirectory()
{
    string FileToReplace = @"c:\tools\file2.txt";
    string FileToDelete = @"c:\tools\file0.txt";

    string strToWrite;
    using (var wtr = File.CreateText(FileToDelete))
    {
        long ticks = DateTime.Now.Ticks;
        strToWrite = string.Join(",", ticks, ticks, ticks);
        wtr.WriteLine(strToWrite);
        wtr.Flush();
        wtr.Close();
    }

    string BackupFileName = Path.Combine(
        Path.GetDirectoryName(FileToReplace),
        string.Format("{0}_{1}{2}",
            Path.GetFileNameWithoutExtension(FileToReplace),
            DateTime.Now.Ticks,
            Path.GetExtension(FileToReplace))
    );

    File.Replace(FileToDelete, FileToReplace, BackupFileName, false);

    using (StreamReader rdr = new StreamReader(FileToReplace))
    {
        string line = rdr.ReadLine();
        Assert.AreEqual(strToWrite, line);
    }
}
我试图写入一个临时文件(使用
Path.GetTempFileName()
)并替换
D:\DropFolder
中的一个文件。它没有发生;它抛出了一个
System.IO.Exception


那么这是否意味着我唯一的选择就是在与
文件相同的目录中创建一种临时文件来替换
并执行此任务?

这是出于设计。使用File.Replace()的目的是能够替换被另一个进程锁定的文件。如果您只有一次机会保存宝贵的数据,这一点非常重要,通常是在机器关闭或程序意外终止时。不用说,这确实需要一两个技巧,因为Windows坚决阻止您覆盖锁定的文件

这是可能的,因为操作系统只锁定文件数据,而不锁定文件的目录条目。换句话说,重命名文件是有效的,即使文件已锁定。基础系统调用与File.Move()相同

它有两种不同的操作方式,具体取决于文件名。如果目标路径位于同一驱动器上,则文件系统只需移动目录项即可。速度很快,无故障。但如果它不在同一个驱动器上,则无法工作,这也需要移动文件数据。这当然很慢,而且在文件数据被锁定的情况下根本不可能


因此,传递给File.Replace()的destinationBackupFileName参数必须是与sourceFileName位于同一驱动器上的路径。不这样做会在移动失败时导致异常。一般来说,不难做到的是,样板文件将使备份文件名与源文件名完全相同,例如,在路径后附加“.bak”。

异常的消息是什么?“无法删除要替换的文件”是否可以
文件替换
仍在其他地方打开?在
文件之前尝试以独占方式打开并关闭它。替换