1

現在、次の P/Invoke シグネチャを使用して、通常の Windows ファイルの短いファイル名を取得しています。

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetShortPathName([MarshalAs(UnmanagedType.LPTStr)] string path,
                                          [MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath,
                                          int shortPathLength);

現在 - 問題なく動作していますが、かなり奇妙なことに気付きました: Windows は次の短いファイル名規則
を使用していることを知っています:

名前を 6 文字に切り詰める (拡張子なし)チルダ( )を
追加 する 一致インデックスを示す符号なし整数を追加する (1 から始まる) 元のファイル拡張子を追加する~

したがって、ファイル名C:\abcdefghijklmn.txtは短い名前でアクセスできる必要がありますC:\abcdefg~1.txt(これは完全に正常に機能しています。)

ここで奇妙な点: 最近、音楽ディレクトリ内で特定のオーディオ ファイルを少し検索しました。これが結果でした:

.\Rammstein & Tatu - Moscow.mp3
.\Rammstein - Asche zu Asche.mp3
.\Rammstein - Der Meister.mp3
.\Rammstein - Du Hast.mp3
.\Rammstein - Eifersucht.mp3
.\Rammstein - Feuer Frei.mp3
.\Rammstein - Führe Mich.mp3
.\Rammstein - Haifisch.mp3
...

そして短い表記法で同じ検索:

.\RA8E17~1.MP3
.\RA23A6~1.MP3
.\RAMMST~1.MP3
.\RA0CAE~1.MP3
.\RAMMST~2.MP3
.\RAMMST~3.MP3
.\RAMMST~4.MP3
.\RA6BAA~1.MP3
...

私の質問は次のとおりです。ウィンドウがチルダの前にそのような「ランダムな」プレフィックスを生成するのはなぜですか (RA23A6やなどRA0CAE)?

4

2 に答える 2

10

マイクロソフトはこれを文書化していませんが、ウィキペディアには次のように記載されています。

8.3 ファイル名:

LFN から 8.3 名を作成するための強制的なアルゴリズムはありませんが、Windows では次の規則が使用されます。

1.LFN が 8.3 大文字の場合、LFN はディスクにまったく保存されません。

  • 例:TEXTFILE.TXT

2. LFN が 8.3 の大文字と小文字が混在する場合、LFN は大文字と小文字が混在する名前を格納しますが、8.3 の名前は大文字バージョンになります。

  • 例:TextFile.TxtになりTEXTFILE.TXTます。

3. ファイル名に 8.3 の名前で許可されていない文字 (API ではなく慣例で許可されていないスペースを含む) が含まれているか、いずれかの部分が長すぎる場合、スペースや余分なピリオドなどの無効な文字が名前から削除されます。などの他の文字+はアンダースコアに変更され、_大文字になります。削除された名前は、ベース名の最初の 6 文字に切り詰められ、その後にチルダ、1 桁の数字、ピリオド.、拡張子の最初の 3 文字が続きます。

  • 例:TextFile1.Mine.txtになりますTEXTFI~1.TXT(またはTEXTFI~2.TXTTEXTFI~1.TXT既に存在する必要があります)。ver +1.2.textになりVER_12~1.TEXます。

4. Windows 2000 以降、短い名前の最初の 6 文字が同じファイルまたはフォルダーが少なくとも 4 つ存在する場合、取り除かれた LFN はベース名の最初の 2 文字 (ベース名が 1 つしかない場合は 1) に切り捨てられます。文書化されていないファイル名のハッシュから派生した 4 桁の 16 進数、チルダ、1 桁の数字、ピリオド.、拡張子の最初の 3 文字が続きます。

  • 例:TextFile.Mine.txtになりTE021F~1.TXTます。

ジョーイが言及したように、ファイル名の文書化されていないハッシュはリバース エンジニアリングされています。

于 2015-07-20T21:08:13.583 に答える
3

これは、カウンターとプレフィックスを使用する非常に原始的なスキームが、特定の数のファイルまでしか機能しないためです。ファイルの数が増えると、Windows は短いプレフィックスとハッシュに切り替えます。誰かが実際にハッシュをリバースエンジニアリングし、少し説明しました:

8.3 のファイル名がどのように機能するかを知らない場合のために、ここで簡単に説明します。

  • ファイル名と拡張子を区切るピリオド以外のピリオドはすべて削除されます - a.testing.file.bat は atestingfile.bat になります。
  • + などの特定の特殊文字はアンダースコアに変換され、その他は削除されます。ファイル名は大文字です。1+2+3 Hello World.exe は 1_2_3HELLOWORLD.EXE になります。
  • ファイル拡張子は 3 文字に切り捨てられ、(8 文字を超える場合) ファイル名は 6 文字に切り捨てられ、その後に ~1 が続きます。SomeStuff.aspx は SOMEST~1.ASP に変わります。
  • これらが衝突を引き起こす場合は、代わりに ~2 が使用され、その後に ~3 と ~4 が続きます。
  • ~5 になる代わりに、ファイル名は 2 文字に切り詰められ、長いファイル名の 16 進数のチェックサムに置き換えられます - SomeStuff.aspx は SOBC84~1.ASP に変わります。 -)文書化されていないチェックサム機能。
于 2015-07-20T21:12:36.653 に答える