.NETを使用して、特定のファイルがいつ変更されたかを判断する方法を探しています。(私が最終的に必要としているのは、ファイルが変更されるとすぐにファイルのコピーを作成する機能です。)これはどのように行うことができますか?
6 に答える
FileSystemWatcherオブジェクトを使用できます。これにより、指定された監視フォルダー内のファイルへの変更に関するイベントが発生します。
class Program
{
static void Main(string[] args)
{
FileSystemWatcher fsw = new FileSystemWatcher(@"c:\temp");
fsw.Changed += new FileSystemEventHandler(fsw_Changed);
fsw.Deleted += new FileSystemEventHandler(fsw_Deleted);
fsw.Renamed += new RenamedEventHandler(fsw_Renamed);
fsw.Created += new FileSystemEventHandler(fsw_Created);
fsw.EnableRaisingEvents = true;
Console.ReadLine();
}
static void fsw_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("{0} was created", e.FullPath);
}
static void fsw_Renamed(object sender, RenamedEventArgs e)
{
Console.WriteLine("{0} was Renamed", e.FullPath);
}
static void fsw_Deleted(object sender, FileSystemEventArgs e)
{
Console.WriteLine("{0} was Deleted", e.FullPath);
}
static void fsw_Changed(object sender, FileSystemEventArgs e)
{
Console.WriteLine("{0} was Changed", e.FullPath);
}
}
で応答したすべての人に、FileSystemWatcherを使用します。アプリが実行されていない時間にどのように対処しますか?たとえば、ユーザーがボックスを再起動し、関心のあるファイルを変更してから、アプリを起動しましたか?
FileSystemWatcherクラスのドキュメント、特にイベントとバッファサイズに関するセクションも注意深くお読みください。
Microsoft Windows とその最終的な祖先である MS-DOS は常に、そのファイルに、その属性が最後にクリアされてからそのファイルが変更されたかどうかを示す属性、一種の「ダーティ フラグ」を持っていました。以前は、増分バックアップが必要なファイルを見つけるためにバックアップ プログラムによって使用され、そのファイルのコピーが作成されたときにクリアされていました。
File.GetAttributes を使用してファイルの属性を取得し、File.SetAttributes を使用してその「アーカイブ」属性をクリアできます。次にそのファイルが書き込み用に開かれると、そのアーカイブ フラグが再び設定されます。
変更されたファイルがまだ開いている可能性があるため、変更されたファイルをコピーする場合は注意してください。おそらく、コピー時に読み取り専用で開くことにより、並行性の問題を回避したいと思うでしょう。それが失敗した場合は、ファイルがまだ書き込み用に開かれていることがわかります。
FileSystemWatcher で問題が発生する可能性があります (イベントを取得できない、イベントが多すぎるなど)。このコードはそれをまとめて、それらの多くを解決します: http://precisionsoftware.blogspot.com/2009/05/filesystemwatcher-done -right.html
確認したいファイルの変更日をメモする必要があります。一定期間後、ファイルが後で変更されたかどうかを確認できます。ファイルが別の日付と時刻で変更されている場合は、コピーを作成できます。