【问题标题】:Rename existing file name重命名现有文件名
【发布时间】:2014-03-27 17:51:53
【问题描述】:

我有以下代码将文件复制到特定文件夹然后重命名它。 当具有该名称的文件已经存在时,我会收到以下异常:

Cannot create a file when that file already exists

有没有办法覆盖文件并重命名它?还是我应该删除旧的然后更改名称?

这是我的代码:

 File.Copy(FileLocation, NewFileLocation, true);
 //Rename:
 File.Move(Path.Combine(NewFileLocation, fileName), Path.Combine(NewFileLocation, "File.txt"));               

【问题讨论】:

  • 为什么要删除旧的?移动应将其重命名为“就地”。
  • 正如杰夫所说,为什么要删除它?为什么不重命名它或给你的新文件一个增量名称? stackoverflow.com/questions/13049732/…
  • @PaulZahra 我认为他的意思是删除任何现有文件,但从帖子中并不清楚。
  • 请不要编辑你的代码来得到你的答案,没有这个就足够令人困惑了,但现在看起来你已经问了一个问题并且问题已经包含了答案,更令人困惑!将您的答案放入您的问题时,至少将其标记为编辑。

标签: c# .net file-io


【解决方案1】:

尝试仅使用:

if (File.Exists("newfilename"))
{
    System.IO.File.Delete("newfilename");
}

System.IO.File.Move("oldfilename", "newfilename");

【讨论】:

  • 它没有帮助-尝试将文件移动到存在同名文件的文件夹时失败并出现异常。
  • 确实,这和OP的尝试是一样的。
  • 之前不需要使用 File.Copy。
  • @LucasAbilidebob:如果文件已经存在,你会收到IOException(见docs)。
【解决方案2】:

一个简单的选择是删除文件(如果存在):

if (System.IO.File.Exists(newFile)) System.IO.File.Delete(newFile);
System.IO.File.Move(oldFile, newFile);

类似的东西应该可以工作。

【讨论】:

    【解决方案3】:

    你是对的,File.Move 将抛出 IOException 如果/当文件名已经存在。因此,要克服这一点,您可以在移动前进行快速检查。例如

    if (File.Exists(destinationFilename))
    {
        File.Delete(destinationFilename);
    }
    File.Move(sourceFilename, destinationFilename);
    

    【讨论】:

    • 当然,根据用例,没有什么可以保证在您移动时没有目标文件。
    【解决方案4】:

    您应该使用File.Exists 而不是让异常抛出。然后,您可以处理文件是否应该被覆盖或重命名。

    【讨论】:

    • 但不要以为它会成功。先验检查是一种优化,但不是很好的控制。
    【解决方案5】:

    第 1 步: 作为第一步,在复制文件之前确定文件是否存在。
    使用File.Exists()方法

    第2步:如果已经存在同名文件,则使用File.Delete()方法删除现有文件

    第 3 步: 现在使用 File.Copy() 方法将文件复制到新位置。

    第 4 步:重命名新复制的文件。

    试试这个:

    string NewFilePath = Path.Combine(NewFileLocation, fileName);
    if(File.Exists(NewFilePath))
    { 
    File.Delete(NewFilePath);
    }
    
    //Now copy the file first
    File.Copy(FileLocation, NewFileLocation, true);
    
    //Now Rename the File
    File.Move(NewFilePath, Path.Combine(NewFileLocation, "File.txt")); 
    

    【讨论】:

      【解决方案6】:

      我总是使用带有 MOVEFILE_REPLACE_EXISTING 标志的 MoveFileEx

      限制:

      1. 它需要使用PInvoke,也就是说你的代码只能在Windows平台上运行。

      2. 此标志 MOVEFILE_REPLACE_EXISTING 仅适用于文件(不适用于文件夹)

      如果 lpNewFileName 或 lpExistingFileName 命名一个目录并且 lpExistingFileName 存在,则报错。

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 2019-12-24
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        • 1970-01-01
        相关资源
        最近更新 更多