web-dev-qa-db-ja.com

既存のファイルを上書きしてファイルをコピーするにはどうすればよいですか?

概要

あるディレクトリから別のディレクトリにすべてのファイルをコピーし、ターゲットディレクトリにある既存の同じ名前のファイルをすべて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を回避してこれを達成するにはどうすればよいですか?

16
Jin Yong

これを試して:

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ドキュメント 3番目のboolパラメーターは、既存のファイルをコピーするファイルで上書きするかどうかを示すことを説明しています。

28
J0e3gan

むしろ使用

File.Copyメソッド(文字列、文字列、ブール)

既存のファイルを新しいファイルにコピーします。同じ名前のファイルを上書きすることは許可されています。

どこ

overwriteType:System.Boolean

宛先ファイルを上書きできる場合はtrue。それ以外の場合はfalse。

7
Adriaan Stander

これは解決策です

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

File.Copyメソッドには、同じ名前の既存のファイルを上書きできるオーバーロードがあります。 http://msdn.Microsoft.com/en-us/library/9706cfs5.aspx を参照してください。

2
cvraman