- ベストアンサー
C#について
C#でファイル検索プログラムを作っています。 Cドライブ以下の「.txt」拡張子のすべてのファイルを新しいディレクトリにコピーしたいんですがどのように記述すればよいのかわかりません。 わかる方お願い致します!
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
using System; namespace Q5571108 { class MainClass { public static void Main (string[] args) { /* * 一応コピー元とコピー先はコマンドライン引数から取っている。お好みに応じてコードを書き換えるべし * 単純にこのコードを打ち込んだだけでは、どのディレクトリからどのディレクトリにコピーするか指定してないのでエラーが出ます */ /* 打ち込んだコマンド * C:\Environment\Users\Projects\OKWave\Q5571108\Q5571108\Q5571108\bin\Debug>Q5571 08.exe "D:\xxx" "D:\yyy" 2>zzz.txt */ Search(new System.IO.DirectoryInfo(args[0]),new System.IO.DirectoryInfo(args[1])); System.Console.WriteLine("finished"); } public static void Search(System.IO.DirectoryInfo sourceDirectoryInfo,System.IO.DirectoryInfo destinationDirectoryInfo){ System.Collections.Generic.List<System.IO.FileInfo> fileinfos = new System.Collections.Generic.List<System.IO.FileInfo>(sourceDirectoryInfo.GetFiles()).FindAll( delegate(System.IO.FileInfo fi){ return fi.Extension == ".txt"; } ); fileinfos.ForEach(delegate(System.IO.FileInfo fi){ /* * 移動先のディレクトリにファイルが同名ファイルが存在した、recursiveな処理を行っていたら同じファイル名に遭遇したなどの場合 * コピーせず、「そのリストのファイルをすべてコピー」とか後で利用出来るようにそれらのファイルのリストを生成する。 * 最初は重複しないように-1とか-2とか足してたけどコッチのほうがエレガントかな、と * * 参考:UNIXという考え方―その設計思想と哲学 (ISBN-13: 978-4274064067) */ /* * ここは新たに生成してから後から引き出すような遠回りする必要はないんだが、 *どうしても文字列で何でも持ち歩くと危ない気がしてしまうので習慣付けている。 */ System.IO.FileInfo destinationFileInfo = new System.IO.FileInfo(System.IO.Path.Combine(destinationDirectoryInfo.FullName,fi.Name)); try{ fi.CopyTo(destinationFileInfo.FullName); }catch(System.IO.IOException e){ /* 自分はエラー出力をそんなに使った事ないんですが、出力、逆のほうがいいですかね?> 識者の人たち */ System.Console.Out.WriteLine(fi.FullName + "will not be copied:"+ e.Message); System.Console.Error.WriteLine(fi.FullName); } } ); /* * recursiveにやりたくなければこの下削除 * recursive:下のディレクトリも見に行く。(構造をコピーするわけじゃないのでこのコードではファイル名の重複でエラーが出る * C:\xxx\aaa.txt * C:\xxx\bbb.txt * C:\xxx\ccc.txt * C:\xxx\aaa\ccc.txt //このファイルも見に行くということ */ (new System.Collections.Generic.List<System.IO.DirectoryInfo>(sourceDirectoryInfo.GetDirectories())).ForEach(delegate(System.IO.DirectoryInfo di){Search(di,destinationDirectoryInfo);}); } } }
お礼
ありがとうございます