Windowsでもinotifywaitを使いたいのでCygwin無しでinotify-winをビルドしてみる

#まずは inotifywait？ なにそれ？ という方向けの説明から
## inotifywait は Linux kernel がサポートするファイルシステムイベント監視の仕組みを使ったコマンドです
inotifywaitは**ファイルが新規に作られたり、書き換えられたり、あるいは削除されたことを検知して対象ファイルを教えてくれる、とても便利なコマンド**です。より正確にいうと、inotify という API を使ってこれらの検知を行うのが inotifywait です。
このAPIは**Linux では Kernel 2.6.13 以降で kernel に組み込まれた機能**なので、いまどきの Linux ディストリビューションなら必ず使える機能です。ただしあくまで kernel の機能として組み込まれただけなので、利用するには inotify の API　を呼ぶプログラムを書くか、さもなくば inotifywait などのツールをインストールして使います。inotifywait は inotify-tools パッケージに含まれていますので apt や yum でインストール可能です。(ただし yum の場合は外部リポジトリの追加が必要なこともあります)

##inotifywaitでできること
前述の通り、新規作成されたファイルや、書き換えられたファイル、削除されたファイルを検知して順番にリストアップしてくれます。

あるいはディレクトリについても同様。

ただそれだけなのですけど、案外イロイロ使えますよー。

##inotifywaitの利用例
ウェブサイトのコンテンツを inotifywait で監視させておけば、改ざんを簡易的に検知する仕組みとして利用できることでしょう。

また、アプリケーションをインストールする前にinotifywaitを実行しておけば、そのインストールによって操作されるファイルをリストアップすることもできます。

あるいは、定形のデータをファイル渡しで複数のプログラムで扱う場合に、inotifywait で監視したフォルダにデータファイルを生成するようにしておけば、ファイルが生成されたことを検知した上で、そのファイルに行うべき処理を自動的に実行するような仕組みも作れます。


#Windows向けのinotifywait？
## FileSystemWatcher クラスを用いたものが github 上にあります
Windowsではファイルシステムに対する変更通知として FileSystemWatcher がありますが、これを用いた実装が下記のリポジトリにあります。

https://github.com/thekid/inotify-win

そして、そのリポジトリの README.md にはこんなふうに書いてあります。

>If you have Cygwin installed, just run make in this directory. This will create the executable, inotifywait.exe.

ここで「えー、Cygwinなの？」と思う方も当然いらっしゃると思うのですが、実は**inotify-win は Cygwin 抜きでビルドできるのです**。その他の開発環境すらも不要です。ただ一つだけ必要なのは Microsoft .NET Framework です。

そのことは README.md にも以下のようにサラリと書かれています。

>Manual complilation goes as follows:
>
>>$ %WINDIR%\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:inotifywait.exe src\*.cs
>>Microsoft (R) Visual C# 2010 Compiler Version 4.0.30319.1
>>Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.
>>
>>$ 

しかしこれは案外見落としがちです。そこで実際の手順をもう少し細かくトレースしてみることにしましょう。


## 実際にビルドしてみる手順

やることは、以下の4ステップです。

- Microsoft .NET Framework をインストールする
- リポジトリを git clone または zip ダウンロードする
- .NET Framework の csc.exe でソースからビルドする
- 実際に実行してみる


下記では実際のビルドと実行の例を紹介しています。

### zip ファイル展開後の状態を確認する
git clone してもよいのですけど、単にビルドしたいだけなので zip ダウンロードするほうがカンタンですね。そして zip ファイルを展開すると、src ディレクトリがあります。そしてここには C# で書かれたソースコードがあります

```
c:\inotify-win-master>dir
 ドライブ C のボリューム ラベルは Windows  です
 ボリューム シリアル番号は 60B8-B4DA です

 c:\inotify-win-master のディレクトリ

2017/03/29  12:35    <DIR>          .
2017/03/29  12:35    <DIR>          ..
2017/03/29  12:00             1,738 LICENSE.md
2017/03/29  12:00               427 Makefile
2017/03/29  12:00             1,481 README.md
2017/03/29  12:31    <DIR>          src
               3 個のファイル               3,646 バイト
               3 個のディレクトリ  96,521,596,928 バイトの空き領域
```

### インストール済みの .NET Framework を確認する

私の環境には 32bit と 64bit の .NET Framework が以下のようにインストール済みです。

```
c:\inotify-win-master>dir c:\Windows\Microsoft.NET\
 ドライブ C のボリューム ラベルは Windows  です
 ボリューム シリアル番号は 60B8-B4DA です

 c:\Windows\Microsoft.NET のディレクトリ

2017/03/29  10:58    <DIR>          .
2017/03/29  10:58    <DIR>          ..
2016/07/16  20:47    <DIR>          assembly
2016/07/16  20:47    <DIR>          authman
2017/01/26  18:44    <DIR>          Framework
2017/01/26  18:44    <DIR>          Framework64
               0 個のファイル                   0 バイト
               6 個のディレクトリ  96,521,531,392 バイトの空き領域

c:\inotify-win-master>dir c:\Windows\Microsoft.NET\Framework64
 ドライブ C のボリューム ラベルは Windows  です
 ボリューム シリアル番号は 60B8-B4DA です

 c:\Windows\Microsoft.NET\Framework64 のディレクトリ

2017/01/26  18:44    <DIR>          .
2017/01/26  18:44    <DIR>          ..
2016/07/25  10:38    <DIR>          1041
2016/07/16  20:43             8,704 sbscmp10.dll
2016/07/16  20:43             8,704 sbscmp20_mscorwks.dll
2016/07/16  20:43             8,704 sbscmp20_perfcounter.dll
2016/07/16  20:43             8,704 SharedReg12.dll
2017/03/17  15:21    <DIR>          v2.0.50727
2016/07/25  10:38    <DIR>          v3.0
2016/07/25  10:38    <DIR>          v3.5
2017/03/29  10:58    <DIR>          v4.0.30319
               4 個のファイル              34,816 バイト
               7 個のディレクトリ  96,521,596,928 バイトの空き領域
```

そこで今回は 64bit の v4.0.30319 でビルドしてみることにします。

### ビルドする

では csc.exe を次のように実行してみましょう。

```
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /t:exe /out:inotifywait.exe src\*.cs
``` 

すると、こんなふうになります。

```
c:\inotify-win-master>c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /t:exe /out:inotifywait.exe src\*.cs
Microsoft (R) Visual C# Compiler version 4.6.1586.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240


c:\inotify-win-master>
```

はたして、ビルドできているでしょうか？ dir コマンドで確認してみます。

```
c:\inotify-win-master>dir inotifywait.exe
 ドライブ C のボリューム ラベルは Windows  です
 ボリューム シリアル番号は 60B8-B4DA です

 c:\inotify-win-master のディレクトリ

2017/03/29  12:35            15,360 inotifywait.exe
               1 個のファイル              15,360 バイト
               0 個のディレクトリ  96,524,464,128 バイトの空き領域
```

こうなっていればビルド完了です。cygwin なんて要らなかったのですね。

### 実際に動かしてみる。

利用についてはここらへんの記事を見て頂くのが良いでしょう。というのも、今回ビルドした inotifywait.exe は Linux 版の inotifywait と基本的に互換となるように実装されているからです。

http://qiita.com/stc1988/items/464410382f8425681c20

ただし**イベント名は小文字で指定する必要がある**ようです。私の環境では、大文字で指定したらプロセスが異常終了してしまいました。

なお、この inotifywait では以下の４つのイベントだけが指定可能であることにご注意ください。

modify
create
delete
move

これは Windows の WacherChangeTypes がこの４種類のイベントしか検知できないことが原因です。これについては WacherChangeTypes の情報を併せてお読みください。
https://msdn.microsoft.com/ja-jp/library/t6xf43e0(v=vs.110).aspx

そういうわけで Linux 版の inotifywait に比べて監視できるイベントが少ないのですけど、これは .NET Framework の縛りなので仕方がありません。

では、とりあえず実行例を２つほどご紹介しておきます。

```
c:\inotify-win-master>inotifywait.exe -rm c:\

===> Monitoring c:\ -r for create, modify, delete, move
c:\inotify-win-master CREATE 新しいテキスト ドキュメント.txt
c:\inotify-win-master MODIFY 新しいテキスト ドキュメント.txt
```

```
c:\inotify-win-master>inotifywait -m --format "%T %e %w\%f" --timefmt "%F %T" -r -e create c:\

===> Monitoring c:\ -r for create
2017/03/29 12:59:35 CREATE c:\inotify-win-master\新しいテキスト ドキュメント.txt
```
出力メッセージの形式をカスタマイズできることも含めて Linux 版の inotifywait とおんなじように使えます。

さて、そもそも自分がWindowsでinotifywaitをどのように使いたかったのか、という話ですが、アプリケーションのインストール前後でのファイルの操作をチェックしたかったのです。この作業によってLinux同様のinotifywaitが使えるようにできたので、これで作業がいろいろと捗りそうです。