[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[port139ml:02616] Re: NTFS ファイル名長の限界 (Re: Re: TASKの UTF-8 patch)



青木です。

At 09:08 03/03/06 +0900, Hideaki Ihara wrote:
>Port139 伊原です。

おはようございます。

>echo で作成した場合、最大長は 265文字まで作成可能なんですかね?
>ストリームを含めるとなぜか 263文字までしか作成できてないです。

>手元で成功している echo でのパターンと最大長を以下のファイル
>に cat&past してあります。
>
>http://www.port139.co.jp/task/longfilename.txt

最初の 265 文字というのが数えると 255 文字に見えるのですが、
私の数え間違いでしょうか?

確かに、コマンドラインやエクスプローラでは Windows API が
許容しているよりも少ないところで何やら制約があるようですね。

私が試したのは、プログラム上で Windows API (CreateFile) を
直接叩きました。但し

#define UNICODE

しないとうまくいかなかったりします。それと、

static WCHAR szLongLongName[] =
        L"\\\\?\\C:\\TEMP\\あああああ .... ";

の形式で、なおかつ Full Path で指定しないといけないみたいです。
このときの限界が、

\\?\C:\TEMP\ああああ ... あああ.txt:いいいい ... いいい
            ←   255 文字        →:←    255 文字   →
でした。
もっと深い階層でやるとどうなるか?  時間があったら試してみます。

ところで Win32 API の FindFirstFile に渡す WIN32_FIND_DATA 構造体は

typedef struct _WIN32_FIND_DATA {
  DWORD    dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD    nFileSizeHigh;
  DWORD    nFileSizeLow;
  DWORD    dwReserved0;
  DWORD    dwReserved1;
  TCHAR    cFileName[ MAX_PATH ];
  TCHAR    cAlternateFileName[ 14 ];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;

で、cFileName は MAX_PATH で長さが決めうちされてますね。
ということは API 的には MAX_PATH 以上は無い、という
前提でしょうか。

ところで、Visual C++ 6.0 SP5 な処理系使ってますが
MAX_PATH は 260 ってなっているみたいですが。。。



-- 
青木 洋二 (Yoji AOKI)
yjaoki@xxxxxxxxxxxxxxxx