「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>ファイルシステム]]

* 目次 [#k72cc8fb]
#contents

*概要 [#jc9a5185]
-GitHubのリポジトリに登録した物件をダウンロードした際、~
取得したZIPファイルが解凍できないなどの問題があったので調査をしてみた。

-ココの問題は、コンピュータに保存されているファイルの識別に用いられる「パス名」に起因する。
--パス名は,ドライブ文字、ディレクトリパス、ファイル名などを一定の記法に従って連結して表記したもの。
--Windowsのパス名には少々複雑な事情があり、さまざまな注意が必要。

*詳細 [#mce43440]

**要因 [#l017ddff]
以下の2つの要因がある(実はファイルシステム側の問題ではなかった)。

***ソフトウェアにパス長の制限がある。 [#r2e25c13]
Windowsの後方互換でパス長の制限があるためパス長の制限があるソフトウェアが現存する。

-NTFSファイルシステムが32K文字までのパスをサポートしている。

-しかし、Windows APIは、後方互換性を重視するため、
--パス最大長がMAX_PATH環境変数で260文字に設定されている。
--パスに " \\?\ "接頭辞を使用すると、260文字を超える文字を使用できる。
--しかし、一部のWin32 APIでは" \\?\ "接頭辞を使用しても制限が解除されない。

>というトコロに原因があるもよう。

-Windows 10 Version 1607以降、MAX_PATHの制限を解除できる。
--レジストリ修正
--若しくは、グループポリシー

***全角文字を理解しないソフトウェアがある。 [#q3a7bdf6]
例えば以下のような例。

-インテル ソフトウェア開発製品 日本語環境でのご注意 | XLsoft エクセルソフト Intel~
https://www.xlsoft.com/jp/products/intel/tech/win_jp_limitation.html
--プログラム中のファイル入出力について、~
フォルダー名に日本語を含むと正常に動作しない。
--Microsoft* Visual Studio* 上でのデバッグ操作において、~
---フォルダー名に日本語がある場合や、
---ソースコードのファイル名に日本語を含むと、

>>ブレークポイントが機能しない

--, etc.

**対策 [#dcf9ba2a]

***ソフトウェアで対応(ZIPの場合) [#z0a6f69d]
-上記の双方([[パス長>#r2e25c13]]、[[全角文字>#q3a7bdf6]])とも、ソフトウェアが対応すれば済む。
-例えば、ZIPであれば7-Zip、WinRARがコレらの問題に対応している。

***パスを変更する。 [#i488252f]

-パスを短くする。~
出力パスが短くなるようにする。~
=圧縮した一式の解凍先を「C:\temp」などとする。

-パスの全角文字を除く。~

*その他 [#m3bc728d]
以下のようなトピックもある模様。

** サービス機能 [#v116207f]
-パス名の解釈に伴う「サービス機能」がある。
-CreateFile( )にはいくつものサービス機能がある。

***機能一覧(一部) [#m787fd52]
+ディレクトリ区切り文字「/」が使用できる。
+ディレクトリ区切り文字の重複「\\」が許される。
+パス名の途中に \.\ を差し挟める。
+パス名の途中に \..\ を差し挟める。
+パス名の末尾の「.」や半角スペースが無視される。

***不活性化 [#b42fbc4b]
「\\?\」から始まるパス名についてはサービス機能が働かなくなる。

**ショートネーム [#b5c92cfc]
Windowsのファイルやディレクトリは

-ロングネームと
-そのロングネームから自動生成されたショートネーム([[8.3形式>#s2289abd]])

の2つを持つ。

***ショートネーム機能のOFF [#v34fea6f]
レジストリのNtfsDisable8dot3NameCreationで自動生成をOFFにできる。

***ショートネームの排除 [#j3a16692]
-パス名に「~」が含まれていたらショートネームが混入されていると見なす。
-APIでショートネームをロングネームに変換するようにする。

**ストリーム [#saa8e7f3]
ファイル名に「:」が含まれていると具合が悪い。

-ファイル名中の「:」は「ADS」を表す区切り記号として意味を持つため。
-詳しくは、[[NTFSの代替データストリーム(ADS)>#m982dc5b]]の仕様を参照。

**予約デバイス名 [#w8f7c7bc]
-MS-DOSの時代に用いられていた古典的な名称
--コンソール
--シリアル通信ポート
--プリンタポートなど

-次の名前はディレクトリやファイルの名前には使ってはならない
--AUX
--CON
--NUL
--PRN
--CLOCK$
--COM1~COM9
--LPT1~LPT9

-10番以降のデバイス~
先頭に\\.\を付ける。

*参考 [#cbb29027]
-ASCII.jp:Windowsのパス区切り文字は、~
なぜ逆スラッシュになったのか?|Windows Info~
http://ascii.jp/elem/000/001/763/1763591/

-8-1. Windowsパス名の落とし穴~
https://www.ipa.go.jp/security/awareness/vendor/programmingv1/b08_01.html

**パス長の制限 [#gb1da2c7]
-260文字のパスの長さ制限がWindowsに存在するのはなぜですか?~
path - limit | CODE Q&A [日本語]~
https://code.i-harness.com/ja/q/1cb101

-Long Paths in .NET, [Kim Hamilton] – BCL Team Blog
--Part 1 of 3~
https://blogs.msdn.microsoft.com/bclteam/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton/
--Part 2 of 3: Long Path Workarounds~
https://blogs.msdn.microsoft.com/bclteam/2007/03/26/long-paths-in-net-part-2-of-3-long-path-workarounds-kim-hamilton/
--Part 3 of 3 Redux~
https://blogs.msdn.microsoft.com/bclteam/2008/07/07/long-paths-in-net-part-3-of-3-redux-kim-hamilton/

-Naming Files, Paths, and Namespaces (Windows)~
https://msdn.microsoft.com/en-us/library/aa365247.aspx

-CreateFileW等のwin32apiでMAX_PATH 超のメモ - Qiita~
https://qiita.com/jugemjugemu/items/4db1dfd3d2737d3979df
>net462 の Fix 260 character file name length limitationで、~
System.IO APIに長いパスのサポートが入った。

**現象 [#t379aa74]
-ファイル名の長さと文字コードの問題:~
プログラマー社長のブログ:オルタナティブ・ブログ~
http://blogs.itmedia.co.jp/komata/2012/11/post-85cf.html

-ファイル名・パス名の文字数制限と日本語名には注意が必要です。~
|滋賀県大津市の小さなパソコン教室「ぱそこんる~む123」~
https://ameblo.jp/pcroom123/entry-11545076070.html

***ZIP [#v9c8a224]
-長いファイル名を含むZIPファイルの解凍~
'-とあるZIPファイルを解凍しよ- その他(ソフトウェア) | 教えて!goo~
https://oshiete.goo.ne.jp/qa/1624421.html

-Zipファイルを展開しようとすると~
「変更先へのパスが長すぎます、圧... - Yahoo!知恵袋~
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1347271633

-Windows XP で ZIP 形式のファイルを解凍すると、~
"指定されたファイルが見つかりません" と~
エラー メッセージが表示されてファイルの解凍ができない場合がある~
https://support.microsoft.com/ja-jp/help/978341

-IBM Knowledge Center~
インストール・ファイルの解凍時における~
「ファイル・パスが長すぎます (File path too long)」などのエラー~
https://www.ibm.com/support/knowledgecenter/ja/SSFUEU_7.1.0/com.ibm.swg.ba.cognos.op_installation_guide.7.1.0.doc/c_in_trbls_uncompress_camphor.html

***・・・ [#e527a04b]
-色々書き足して行こうと考えていたけど、良いネタが無いかも。
-最近遭遇した、減少に、フォルダ名にC#の「#」が混在していると.NET CoreのBuildに失敗するというのがあった。

-最近遭遇した、現象に、
--フォルダ名にC#の「#」が混在していると.NET CoreのBuildに失敗する。
--roslynの完全限定型名は 260 文字、ディレクトリ名は 248 文字以上だと失敗する。
 ---------------------------
 Microsoft Visual Studio
 ---------------------------
 式 "roslyn\%(RecursiveDir)%(Filename)%(Extension)" の中のメタデータを展開できません。 
 項目メタデータ "%(Filename)" をパス 
 "....\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\build\net46\
 ..\..\tools\roslynlatest\System.Security.Cryptography.X509Certificates.dll"
 に適用できません。指定されたパス、ファイル名、またはその両方が長すぎます。
 完全限定型名は 260 文字未満で指定し、ディレクトリ名は 248 未満で指定してください。


>というモノがあった。

--後者は「#」→「S」で解決するけど、
--前者はフォルダ構成を変更する必要がある。

**その他 [#ya6f4422]

***8.3形式 [#s2289abd]
-8.3形式 - Wikipedia~
https://ja.wikipedia.org/wiki/8.3%E5%BD%A2%E5%BC%8F

***代替データストリーム(ADS) [#m982dc5b]
ADS: Alternate Data Stream

-ASCII.jp:インターネットからダウンロードしたファイルは~
Zone.Identifierでセキュリティ管理をする|Windows Info~
http://ascii.jp/elem/000/001/550/1550399/

-フォーク (ファイルシステム) - Wikipedia~
https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A9%E3%83%BC%E3%82%AF_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)

----
Tags: [[:インフラストラクチャ]], [[:Windows]]



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS