2009/11/30

C#MacOS9混在だとGetFilesが落ちる

このエントリーをはてなブックマークに追加
MacOS9とWindowsの混在環境における現象です。
もうこんな環境はほとんどないかもしれませんけれどね。

MacOSはファイルに対しての情報を保持するために、同じ階層のフォルダ内に隠しファイルをいくつか生成します。Macでのオペレーションの上ではそれらのファイルは見えないようになっているのですが、Windowsからアクセスすると、思い当たらないファイルやフォルダが隠しファイルとして山のように出現しているのです。

そのフォルダに対してSystem.IO.Directory.GetFilesでファイルを列挙しようとすると、例外エラーを吐いて落ちる。
原因は、その隠しファイルの一つである「Icon」という名前のファイルにあります。実はこのファイルは、「Icon\r」という名前で、Windows上ではありえないファイル名となっているのです。

ですが、Windowsのエクスプローラ上でそのファイルが見えるということは、直接APIを呼んであげれば一応取得できるということを示しています。
↓こういうの


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class FindData {
public const int INVALID_HANDLE_VALUE = -1;
public int fileAttributes = 0;
public int creationTime_lowDateTime = 0;
public int creationTime_highDateTime = 0;
public int lastAccessTime_lowDateTime = 0;
public int lastAccessTime_highDateTime = 0;
public int lastWriteTime_lowDateTime = 0;
public int lastWriteTime_highDateTime = 0;
public int nFileSizeHigh = 0;
public int nFileSizeLow = 0;
public int dwReserved0 = 0;
public int dwReserved1 = 0;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public String fileName = null;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public String alternateFileName = null;
}

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindFirstFile(String fileName, [In, Out] FindData findFileData);

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int FindNextFile(IntPtr handle, [In, Out] FindData findFileData);

Windowsから、例えばNASのファイルを一括にバックアップを取ろうとすると、きっと上記のことが原因で失敗しまうのではないかと思われます。

他にMacOS混在環境にてトラップになりそうなファイル名。


  • 末尾に半角スペースが入っている

  • MacOSでは、日本語の漢字変換するためにはスペースを押して変換候補を探します。全角入力だと問題ないのですが、英数入力していてても習慣的に変換キーとなるスペースキーを打ってしまうことがあって、その状態のままファイル名を決定してしまうと、末尾に半角スペースが入ったファイル名ができあがります。これがWindows上では操作不能なファイルとなる。半角スペースだけに、オペレータも気づきにくい。

  • 半角スラッシュが入っている

  • 半角アスタリスクなども同様。
    MacOS上では、普通に使われてしまいますのでタチが悪いです。もとい。タチが悪いのはWindowsのほうというべきかもしれません。
    全角を使うようにしましょう。
    Windowsで見ると、「_U78ID~Y」とか「_9LPCK~0」という風に表示され、ファイル名が正常に取得できません。
    半角円マークの場合は、文字コードが違うのか、何故か許容するようです。

  • 拡張子のドットの代わりに半角カンマを入れている

  • Macユーザーには長らく拡張子の習慣がなかったので、十年ほど前の時代のファイルにはありがちです。

0 件のコメント :

コメントを投稿