2014年05月06日

ファイル更新の監視

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その4

■問題 (出題者:にしお さん) 

あるファイル名がfilenameという変数に入っているとします。 このファイルが更新されるたびに"modified!"と表示するプログラムを作ってください。 もしOSに依存する場合はそのOS名のタグを、 依存しない場合は「OS非依存」というタグをつけてください。 わからなければつけなくても構いません。


filenameにワイルドカードを指定できるようにしてみました。 また、modified! のほかに、created! renamed! deleted! も表示できるようにしています。

■C#で書いたコード
using System;
using System.IO;

namespace Sample {
    class Program {
        static void Main(string[] args) {
            string filename = @"d:\temp\*.txt";
            StartFileWatcher(filename);

            // 以下テストコード
            // 最後のReadKeyを実行する前ならば、
            // エクスプローラでファイル作成等をしても確認できる。
            Console.ReadKey();
            var stream = File.Create(@"d:\temp\FileSystemWatcher1.txt");
            stream.Close();
            Console.ReadKey();

            File.WriteAllText(@"d:\temp\FileSystemWatcher2.txt", "aaa");
            Console.ReadKey();

            File.Move(@"d:\temp\FileSystemWatcher1.txt", @"d:\temp\FileSystemWatcher3.txt");
            Console.ReadKey();

            File.Delete(@"d:\temp\FileSystemWatcher2.txt");
            File.Delete(@"d:\temp\FileSystemWatcher3.txt");
            Console.ReadKey();
        }

        static void StartFileWatcher(string filename) {
            string path = Path.GetDirectoryName(filename);
            string name = Path.GetFileName(filename);

            FileSystemWatcher fsw = new FileSystemWatcher(path, name);
            fsw.Changed += fsw_Changed;

            // ラムダ式を使って書いた場合
            fsw.Renamed += (sender, eventArgs) => Console.WriteLine("renamed!");
            fsw.Created += (sender, eventArgs) => Console.WriteLine("created!");
            fsw.Deleted += (sender, eventArgs) => Console.WriteLine("deleted!");
            fsw.EnableRaisingEvents = true;           
        }       

        static void fsw_Changed(object sender, FileSystemEventArgs e) {
            Console.WriteLine("modified!");
        }
    }
}


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52369271