ようこそ 屋根裏部屋 mkII へ ログイン | 登録 | ヘルプ

Technological

ちょっとしたTIPSや私がはまったこと、調べたことなんかを書いていきます。

Windowsのファイル名の最大長考察

NTFSファイルシステムにおいて、CRTでは256文字と定義されていますが、CreateFileではワイド文字であれば、32767文字まで指定できるとあります。ちょっと実験してみましょう。

   1:  void Win32UnicodeName(void)
   2:  {
   3:       WCHAR wszLongLongName[] = L"\\\\?\\c:\\temp\\" 
   4:          L"123456789012345678901234567890"
   5:          L"123456789012345678901234567890"
   6:          L"123456789012345678901234567890"
   7:          L"123456789012345678901234567890"
   8:          L"123456789012345678901234567890"
   9:          L"123456789012345678901234567890"
  10:          L"123456789012345678901234567890"
  11:          L"123456789012345678901234567890"
  12:          L"123456789012.txt";
  13:   
  14:      HANDLE hLongFile = CreateFileW(wszLongLongName, GENERIC_READ | GENERIC_WRITE, 
  15:           0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
  16:   
  17:      if(hLongFile == INVALID_HANDLE_VALUE) {
  18:          _tprintf(_TEXT("Error:%ld\n"), GetLastError());
  19:      }else{
  20:          CloseHandle(hLongFile);
  21:      }
  22:   
  23:      char szLongLongName[] = "\\\\?\\c:\\temp\\" 
  24:              "123456789012345678901234567890"
  25:              "123456789012345678901234567890"
  26:              "123456789012345678901234567890"
  27:              "123456789012345678901234567890"
  28:              "123456789012345678901234567890"
  31:              "123456789012345678901234567890"
  32:              "123456789012345678901234567890"
  33:              "123456789012345678901234567890"
  34:              "1234567890.txt";
  35:      hLongFile = CreateFileA(szLongLongName, GENERIC_READ | GENERIC_WRITE, 
  36:          0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
  37:      if(hLongFile == INVALID_HANDLE_VALUE) {
  38:          _tprintf(_TEXT("Error:%ld\n"), GetLastError());
  39:      }else{
  40:          CloseHandle(hLongFile);
  41:      }
  42:  }

前半分のWCHARはエラーになり、エラーはこんな形になります。

GetLastError()の戻り値、123はERROR_INVALID_NAME(無効なファイル名)です。206はERROR_FILENAME_EXCED_RANGE(ファイル名が期待した長さを超えている)です。

上のソースコードの12行目を

L"12345678901.txt";

に変更すると、成功して、画面にはこのようなエラーが表示されます。

CreateFileA(ANSI版)では相変わらず同じエラーですが、CreateFileWでは正しく作れています。ところが作れたファイルも、実は意外な落とし穴があります。

cmd.exeでは表示されるファイルもなぜかPowerSherllでは表示されません。あれれ?

関連)

Windows のファイル-Part1 CRT

Windows のファイル-Part2 CRT とUNC

公開 2007年12月13日 1:26 投稿者 kkamegawa
タグ , , , ,

コメントの通知

この投稿にコメントが付いた場合にメールを受信するには、登録してください。ここ

また次のフィードから、お気に入りのRSSリーダーを使って最新の状態を知ることもできます。 コメントのRSSフィード

コメント

# file max length in dot NET Framework @ 2007年12月17日 1:32

Windowsのファイル名の最大長考察 で最大ファイル名を少し試してみました。最後のPowerShellでより長いファイル名が扱えないということが疑問だったので、.NET Frameworkで試してみましょう。

Technological

どのような感想ですか?

(必須) 
必須 
(必須) 
Powered by Community Server, by Telligent Systems