如何复制文件并覆盖已有的文件?

22

概述

如何使用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个回答

36

试试这个:

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文档 解释了第三个参数 bool 表示是否使用正在复制的文件覆盖现有文件。


8

建议使用

File.Copy 方法 (String, String, Boolean)

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

其中

overwriteType: System.Boolean

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


5
这是一个解决方案。
foreach (string path in Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories))
    File.Copy(path, path.Replace(SourcePath, DestinationPath));

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接