やりたいこと。
「開発をしていたんだが、ソース管理されていないコードをちょろっと直したので、フォルダ構成とか、そのままで、指定された日付以降に変更したファイルだけ抜き出して、フォルダ構成もそのままで、ファイル保存したい」
で、そんな簡単なこと、なんかツールでもねぇかなと思って、IRCでプロベンのみんなに聞いてみて、ソフトも教えてもらったんだけど、あんまりにも使いにくそうだったので、さくっとコードを書いた。
Windowsの検索は、フォルダ構成をそのままにコピーっていうのができないんだよねぇ。めどい。
と言うわけで、そのようなコードが以下。コードは.net3.5で、Linqを使っています。Linqなら簡単。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace FileCopy
{
class Program
{
static void Main(string[] args)
{
string startFolder = @"C:\Windows\Temp";
//指定されたフォルダ以下のファイルの列挙を取得するためのデリゲート。
//別に、メソッドにしてもいいんだけどね
Func<IEnumerable<FileInfo>> getFileInfoList = new Func<IEnumerable<FileInfo>>(delegate()
{
List<FileInfo> result = new List<FileInfo>();
if (!Directory.Exists(startFolder))
{
throw new DirectoryNotFoundException();
}
foreach (string fileName in Directory.GetFiles(startFolder, "*.*", System.IO.SearchOption.AllDirectories))
{
result.Add(new FileInfo(fileName));
}
return result;
});
//Linqを使って、列挙する
//今回は指定された日付以上の変更されたファイルを取ってるけど、Linqの作り方でなんでもできる
IEnumerable<FileInfo> fileQuery = from file in getFileInfoList()
where file.LastWriteTime >= new DateTime(2009, 11, 15, 16, 40, 0)
orderby file.Name
select file;
//テストで表示
foreach (System.IO.FileInfo fi in fileQuery)
{
Console.WriteLine(fi.FullName);
}
#if DEBUG
Console.Read();
#endif
}
}
}
これで、対象のファイルは列挙されるので、あとはFileNameからdestのファイルを作って、File.Copyで。ディレクトリの存在は、別のFileInfoでも作れば、Createも簡単でしょ。