如何复制文件,覆盖现有文件?

时间:2013-05-15 04:16:33

标签: c# .net file-io

概述

如何将所有文件从一个目录复制到另一个目录,并使用C#覆盖目标目录中所有现有的同名文件?

我有以下代码将文件从一个目录复制到另一个目录......

const string sourceDir = @"C:\AppProject\Smart\SmartStaff\site\document";
const string targetDir = @"C:\AppProject\Smart\ExternalSmartStaff\site\document";
foreach (var file in Directory.GetFiles(sourceDir))
    File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file)));

...,但是当目标目录已包含与源目录中的文件同名的文件时,它将失败并显示错误System.IO.IOException: The file 'C:\AppProject\Smart\ExternalSmartStaff\site\document\SomeDocument.txt' already exists.

详细

要明确,请给出以下目录和文件......

C:\>dir C:\AppProject\Smart\SmartStaff\site\document
 ...

 Directory of C:\AppProject\Smart\SmartStaff\site\document

09/03/2014  06:38 PM    <DIR>          .
09/03/2014  06:38 PM    <DIR>          ..
05/25/2014  08:29 PM                44 SomeDocument.txt
05/25/2014  08:32 PM                21 SomeDocument2.txt
05/25/2014  08:36 PM                21 SomeDocument3.txt
05/25/2014  08:43 PM                44 SomeDocument4.txt
               4 File(s)            130 bytes
               2 Dir(s)  128,326,766,592 bytes free

C:\>dir C:\AppProject\Smart\ExternalSmartStaff\site\document
 ...

 Directory of C:\AppProject\Smart\ExternalSmartStaff\site\document

09/03/2014  06:39 PM    <DIR>          .
09/03/2014  06:39 PM    <DIR>          ..
09/03/2014  06:39 PM                26 SomeDocument.txt
09/03/2014  06:39 PM                54 SomeDocument2.txt
               2 File(s)             80 bytes
               2 Dir(s)  128,326,766,592 bytes free

...,我希望在{C#:

中的文件复制之后C:\AppProject\Smart\ExternalSmartStaff\site\document看起来像这样
C:\>dir C:\AppProject\Smart\ExternalSmartStaff\site\document
 ...

 Directory of C:\AppProject\Smart\ExternalSmartStaff\site\document

09/03/2014  06:47 PM    <DIR>          .
09/03/2014  06:47 PM    <DIR>          ..
05/25/2014  08:29 PM                44 SomeDocument.txt
05/25/2014  08:32 PM                21 SomeDocument2.txt
05/25/2014  08:36 PM                21 SomeDocument3.txt
05/25/2014  08:43 PM                44 SomeDocument4.txt
               4 File(s)            130 bytes
               2 Dir(s)  128,327,835,648 bytes free

如何避免IOException并完成此操作?

4 个答案:

答案 0 :(得分:28)

试试这个:

const string sourceDir = @"C:\AppProject\Smart\SmartStaff\site\document";
const string targetDir = @"C:\AppProject\Smart\ExternalSmartStaff\site\document";
foreach (var file in Directory.GetFiles(sourceDir))
    File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file)), true);

基本上,您只需要调用File.Copy的不同重载。 MSDN documentation解释了第三个bool参数是指示是否用正在复制的文件覆盖现有文件。

答案 1 :(得分:7)

而是使用

File.Copy Method (String, String, Boolean)

  

将现有文件复制到新文件。覆盖相同的文件   名字是允许的。

其中

  

overwriteType:System.Boolean

     

如果目标文件可以被覆盖,则为true;否则,错误。

答案 2 :(得分:4)

这是一个解决方案

foreach (string path in Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories))
    File.Copy(path, path.Replace(SourcePath, DestinationPath));

答案 3 :(得分:2)

File.Copy方法有一个重载,允许覆盖具有相同名称的现有文件。  请参阅http://msdn.microsoft.com/en-us/library/9706cfs5.aspx