32bitのmonoは64bitのiノード番号を扱うことが出来ない

※2012年12月1日、続き

C#で自作したツールを使ってファイルを処理しようとしたところ、何もせずに終了してしまったのでソースをチマチマと弄って原因を探ってみたら、System.IO.Directory.GetFilesメソッドの戻り値にファイル名が含まれていない事が分かったので、それらのファイルを調べてみた結果、どうやらiノード番号が4294967295 (UINT_MAX) を超えるファイルがあるとエラーも表示せずに終了するらしい、という結論に達した。

再現方法は次の通り。

まず、64bitのUbuntuで以下を行う。

  1. XFSなパーティションを作成する。
  2. そのパーティションをinode64オプションを付けてマウントする。
  3. そのパーティションにiノード番号がUINT_MAXを超えるファイルを作成する。

次に、32bitのUbuntuで以下を行う。

  1. そのパーティションをinode64オプションを付けてマウントする。
  2. dmcsを使ってSystem.IO.Directory.GetFilesメソッドを含むC#アプリをコンパイルし、上記のパーティションをマウントしたフォルダを対象にして実行する。

そのツールJavaで書き直してみたところ、正常に動作した。クソッ!なんて時代だ!