「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
- GitHubのリポジトリに登録した物件をダウンロードした際、
取得したZIPファイルが解凍できないなどの問題があったので調査をしてみた。
- ココの問題は、コンピュータに保存されているファイルの識別に用いられる「パス名」に起因する。
- パス名は,ドライブ文字、ディレクトリパス、ファイル名などを一定の記法に従って連結して表記したもの。
- Windowsのパス名には少々複雑な事情があり、さまざまな注意が必要。
詳細 †
要因 †
以下の2つの要因がある(実はファイルシステム側の問題ではなかった)。
ソフトウェアにパス長の制限がある。 †
Windowsの後方互換でパス長の制限があるためパス長の制限があるソフトウェアが現存する。
- NTFSファイルシステムが32K文字までのパスをサポートしている。
- しかし、Windows APIは、後方互換性を重視するため、
- パス最大長がMAX_PATH環境変数で260文字に設定されている。
- パスに " \\?\ "接頭辞を使用すると、260文字を超える文字を使用できる。
- しかし、一部のWin32 APIでは" \\?\ "接頭辞を使用しても制限が解除されない。
というトコロに原因があるもよう。
- Windows 10 Version 1607以降、MAX_PATHの制限を解除できる。
全角文字を理解しないソフトウェアがある。 †
例えば以下のような例。
ブレークポイントが機能しない
対策 †
ソフトウェアで対応(ZIPの場合) †
- 上記の双方(パス長、全角文字)とも、ソフトウェアが対応すれば済む。
- 例えば、ZIPであれば7-Zip、WinRARがコレらの問題に対応している。
パスを変更する。 †
- パスを短くする。
出力パスが短くなるようにする。
=圧縮した一式の解凍先を「C:\temp」などとする。
その他 †
以下のようなトピックもある模様。
サービス機能 †
- パス名の解釈に伴う「サービス機能」がある。
- CreateFile?( )にはいくつものサービス機能がある。
機能一覧(一部) †
- ディレクトリ区切り文字「/」が使用できる。
- ディレクトリ区切り文字の重複「\\」が許される。
- パス名の途中に \.\ を差し挟める。
- パス名の途中に \..\ を差し挟める。
- パス名の末尾の「.」や半角スペースが無視される。
不活性化 †
「\\?\」から始まるパス名についてはサービス機能が働かなくなる。
ショートネーム †
Windowsのファイルやディレクトリは
- ロングネームと
- そのロングネームから自動生成されたショートネーム(8.3形式)
の2つを持つ。
ショートネーム機能のOFF †
レジストリのNtfsDisable8dot3NameCreation?で自動生成をOFFにできる。
ショートネームの排除 †
- パス名に「~」が含まれていたらショートネームが混入されていると見なす。
- APIでショートネームをロングネームに変換するようにする。
ストリーム †
ファイル名に「:」が含まれていると具合が悪い。
予約デバイス名 †
- MS-DOSの時代に用いられていた古典的な名称
- コンソール
- シリアル通信ポート
- プリンタポートなど
- 次の名前はディレクトリやファイルの名前には使ってはならない
- AUX
- CON
- NUL
- PRN
- CLOCK$
- COM1~COM9
- LPT1~LPT9
参考 †
パス長の制限 †
- Long Paths in .NET, [Kim Hamilton] – BCL Team Blog
現象 †
ZIP †
・・・ †
- 色々書き足して行こうと考えていたけど、良いネタが無いかも。
- 最近遭遇した、減少に、フォルダ名にC#の「#」が混在していると.NET CoreのBuildに失敗するというのがあった。
その他 †
8.3形式 †
代替データストリーム(ADS) †
ADS: Alternate Data Stream
Tags: :インフラストラクチャ, :Windows