MONO_IOMAP は、Mono で使用できる環境変数で、「man mono」では、次のように説明されている。
PORTABILITY
On Unix-based systems, Mono provides a mechanism to emulate the Windows-style file access, this includes providing a case insensitive view of the file system, directory separator mapping (from \ to /) and stripping the drive letters.
This functionality is enabled by setting the MONO_IOMAP environment variable to one of all, drive and case.
See the description for MONO_IOMAP in the environment variables section for more details.
移植性
Unix ベースのシステムで、Mono は Windows スタイルのファイルへのアクセスをエミュレートするためのメカニズムを提供します。これには、大文字と小文字の区別をしないファイルシステム上の表示、ディレクトリの区切り文字のマッピング(「\」から「/」へ変換)、ドライブ文字の除去が含まれます。
この機能は、MONO_IOMAP 環境変数に、「all」「drive」「case」の内、どれか一つを設定することで有効になります。
詳細については、環境変数のセクションで MONO_IOMAP の説明を参照して下さい。
MONO_IOMAP
Enables some filename rewriting support to assist badly-written applications that hard-code Windows paths. Set to a colon-separated list of "drive" to strip drive letters, or "case" to do case-insensitive file matching in every directory in a path. "all" enables all rewriting methods. (Backslashes are always mapped to slashes if this variable is set to a valid option.)
For example, this would work from the shell:
MONO_IOMAP=drive:case
export MONO_IOMAP
If you are using mod_mono to host your web applications, you can use the MonoSetEnv directive, like this:
MonoSetEnv MONO_IOMAP=all
MONO_IOMAPそれで、次のような簡単なコードで MONO_IOMAP の効き具合を試してみた。
Windows でのパスをハードコードするような、まずい書き方をされたアプリケーションを支援するために、いくつかのファイル名書き換えサポートを有効にします。コロンで区切られたリストによる設定が可能で、"drive" はドライブ文字の除去、また、"case" は大文字と小文字を区別しないで、すべてのディレクトリ内のパスで、ファイルマッチングを行います。"all" はすべての書き換え手法を有効にします。(この変数に有効なオプションが設定されている場合、バックスラッシュは、常にスラッシュにマップされます。)
例えば、シェルからでは、このような記述が有効になります:
MONO_IOMAP=drive:case
export MONO_IOMAP
Web アプリケーションをホストするのに mod_mono を使用する場合、このように MonoSetEnv ディレクティブを使用できます:
MonoSetEnv MONO_IOMAP=all
iomaptest.cs:
using System; using System.IO; public class IOMapTest { public static void Main() { //using(StreamReader sr = new StreamReader("/home/sta/data/test.txt")) using(StreamReader sr = new StreamReader(@"C:\home\sta\data\test.txt")) { string line; while((line = sr.ReadLine()) != null) { Console.WriteLine(line); } } } } /* * Build: * * gmcs iomaptest.cs * * Run: * * mono iomaptest.exe * *//home/sta/data/test.txt:
File opened successfully.
$ mono iomaptest.exe Unhandled Exception: System.IO.FileNotFoundException: Could not find file "/home/sta/src/cs/C:\home\sta\data\test.txt". File name: '/home/sta/src/cs/C:\home\sta\data\test.txt' ... $ export MONO_IOMAP=drive $ mono iomaptest.exe File opened successfully.
また、
using(StreamReader sr = new StreamReader(@"C:\home\sta\data\Test.txt"))とした場合、
$ mono iomaptest.exe Unhandled Exception: System.IO.FileNotFoundException: Could not find file "/home/sta/src/cs/C:\home\sta\data\Test.txt". File name: '/home/sta/src/cs/C:\home\sta\data\Test.txt' ... $ export MONO_IOMAP=drive:case $ mono iomaptest.exe File opened successfully. $ export MONO_IOMAP=all $ mono iomaptest.exe File opened successfully.
ということは、確認できた。
つまり、「環境変数 MONO_IOMAP に all を設定しておけばいいんだYo!」ということは言えるかもしれないが、「そうは問屋は卸さんよ、フフフ」という具合に、うまくいかない場合も実はあったが、それはまた後日。
0 件のコメント:
コメントを投稿