くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

Xamarin.Android で フォルダを監視する

フォルダに新しいファイルが追加されたり削除されたりなどのイベントを削除するのを監視したいときがよくあると思います。

コード

まずは、 FileObserver のサブクラスを作成します。

public class DCIMObserver: FileObserver
    {
        public DCIMObserver(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
        {

        }

        public DCIMObserver(string path) : base(path)
        {
        }

        public DCIMObserver(string path, FileObserverEvents mask) : base(path, mask)
        {
        }

        public override void OnEvent(FileObserverEvents e, string path)
        {
            // アウトプットするのを制御
            if (e == FileObserverEvents.Create || e == FileObserverEvents.Delete || e == FileObserverEvents.MovedTo)
            {
                // 見やすくするために出力してる
                Console.WriteLine($"path {path}: {e}");
            }
        }
    }

継承したクラスを利用して監視

namespace AndroiFolder
{
    [Activity(Label = "AndroiFolder", MainLauncher = true)]
    public class MainActivity : Activity
    {
        // DCIM Observer のインスタンスを作成してるよん!
        public FileObserver FileObserver { get; set; } = new DCIMObserver(GetPathForDCIM());

        private static string GetPathForDCIM()
        {
            // DCIM フォルダを取得してる
            return Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDcim).Path;
        }

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // 監視を開始するよん!
            FileObserver.StartWatching();
        }
    }
}

結果

こんな感じ f:id:kuxumarin:20171115220048p:plain

参考にしたサイト

ころいどさんの書いた記事は良く参考にしてますw qiita.com