あるディレクトリから別のディレクトリにすべてのファイルをコピーし、ターゲットディレクトリにある既存の同じ名前のファイルをすべて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
を回避してこれを達成するにはどうすればよいですか?
これを試して:
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
パラメーターは、既存のファイルをコピーするファイルで上書きするかどうかを示すことを説明しています。
むしろ使用
既存のファイルを新しいファイルにコピーします。同じ名前のファイルを上書きすることは許可されています。
どこ
overwriteType:System.Boolean
宛先ファイルを上書きできる場合はtrue。それ以外の場合はfalse。
これは解決策です
foreach (string path in Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories))
File.Copy(path, path.Replace(SourcePath, DestinationPath));
File.Copy
メソッドには、同じ名前の既存のファイルを上書きできるオーバーロードがあります。 http://msdn.Microsoft.com/en-us/library/9706cfs5.aspx を参照してください。