「Windowsのパス長さ制限に関して」の版間の差分
Notion-MW タグ: 差し戻し済み |
Notion-MW |
||
(同じ利用者による、間の3版が非表示) | |||
26行目: | 26行目: | ||
この制限は最近のWindowsならLongPathsEnabledというレジストリの値を1に設定することで解除できるとされている。例えばPowerShell上で以下を実行すればよい。 | この制限は最近のWindowsならLongPathsEnabledというレジストリの値を1に設定することで解除できるとされている。例えばPowerShell上で以下を実行すればよい。 | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="powershell">Set-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" -Name LongPathsEnabled -value 1</syntaxhighlight> | ||
Set-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" -Name LongPathsEnabled -value 1</syntaxhighlight> | |||
また、現在の値を確認するには以下を実行する。 | また、現在の値を確認するには以下を実行する。 | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="powershell">(Get-Item -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem").GetValue("LongPathsEnabled")</syntaxhighlight> | ||
(Get-Item -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem").GetValue("LongPathsEnabled")</syntaxhighlight> | |||
しかし、制限を解除すれば全ての操作が支障なくできるというわけではない。例えば、Windows APIのマルチバイト文字方式の関数(末尾がAのもの)は長いパスに対応していない(末尾がWのワイド文字方式のものは対応している)らしく、これを使用しているアプリケーションはこの制限を解除しても正しく動かない。またエクスプローラ上での操作性もほとんど改善しない。 | しかし、制限を解除すれば全ての操作が支障なくできるというわけではない。例えば、Windows APIのマルチバイト文字方式の関数(末尾がAのもの)は長いパスに対応していない(末尾がWのワイド文字方式のものは対応している)らしく、これを使用しているアプリケーションはこの制限を解除しても正しく動かない。またエクスプローラ上での操作性もほとんど改善しない。 | ||
94行目: | 88行目: | ||
おそらくアプリケーション側の都合で、長さ制限を超えるパスをカレントディレクトリとしての起動に対応していないことがある。具体的には、Git Bashで、長い名前をもつフォルダを開いているとき、mspaintやcmdの実行に失敗する。次のようなメッセージが出る。 | おそらくアプリケーション側の都合で、長さ制限を超えるパスをカレントディレクトリとしての起動に対応していないことがある。具体的には、Git Bashで、長い名前をもつフォルダを開いているとき、mspaintやcmdの実行に失敗する。次のようなメッセージが出る。 | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="latex">Error: Current working directory has a path longer than allowed for a | ||
Error: Current working directory has a path longer than allowed for a | |||
Win32 working directory. | Win32 working directory. | ||
Can't start native Windows application from here. | Can't start native Windows application from here. | ||
118行目: | 109行目: | ||
さて、explorerは、制限を超える長いパスに対しては概ね次のような原則で対処しようとするようである。 | さて、explorerは、制限を超える長いパスに対しては概ね次のような原則で対処しようとするようである。 | ||
# 8.3形式の名前を使用して「可能な限り最も短いパス」を得て、これを使う。 | |||
# 8.3形式の名前がない、あるいはそれを使っても制限を超過するなどの場合は、パス先頭に”<code>\\?\</code>”プレフィックスを付加する。 | |||
例えばexplorerのアドレスバーを見ると、このように動作していることがわかるだろう。あるいは、そのフォルダおけるexplorerの挙動はアドレスバーを見れば大体予測できるということにもなる。ファイルに関して調べたければ「パスのコピー」を使うとよい。なお、手動でプレフィックスや8.3形式の名前をエクスプローラのアドレスバーに入力して移動した際は、通常のパスに変換される(それが長さ制限を超えていれば改めて上記の対処が行われる)。 | 例えばexplorerのアドレスバーを見ると、このように動作していることがわかるだろう。あるいは、そのフォルダおけるexplorerの挙動はアドレスバーを見れば大体予測できるということにもなる。ファイルに関して調べたければ「パスのコピー」を使うとよい。なお、手動でプレフィックスや8.3形式の名前をエクスプローラのアドレスバーに入力して移動した際は、通常のパスに変換される(それが長さ制限を超えていれば改めて上記の対処が行われる)。 | ||
192行目: | 183行目: | ||
ただし、逆にWindowsにない制限として、Unixではそれぞれの<strong>ファイル名の長さ上限が255バイト</strong>という制限がある(Windowsと違って<strong>パス長さ</strong>の制限は4096なので、長さ200バイトの名前のフォルダの中に長さ200バイトの名前のフォルダを作るにあたっては不自由がない)。また、エンコードはUTF-8を基準に計算されるので、3バイトで表現される通常の日本語の文字(ひらがなや漢字)だと85文字、U+10000を超えるような文字(𩸽など)だと4バイト分なので63文字しか入らない。Windows上ではこれらを超える長さのフォルダを作れるが、Git Bashではそこにcdできないということになる。 | ただし、逆にWindowsにない制限として、Unixではそれぞれの<strong>ファイル名の長さ上限が255バイト</strong>という制限がある(Windowsと違って<strong>パス長さ</strong>の制限は4096なので、長さ200バイトの名前のフォルダの中に長さ200バイトの名前のフォルダを作るにあたっては不自由がない)。また、エンコードはUTF-8を基準に計算されるので、3バイトで表現される通常の日本語の文字(ひらがなや漢字)だと85文字、U+10000を超えるような文字(𩸽など)だと4バイト分なので63文字しか入らない。Windows上ではこれらを超える長さのフォルダを作れるが、Git Bashではそこにcdできないということになる。 | ||
<span id="webdav"></span> | |||
=== WebDAV === | |||
Windowsでは、<code>host:port</code>において稼働しているWebDAVサーバーの<code>my/folder</code>というフォルダに、<code>\\host@port\my\folder</code>あるいは<code>\\host@port\DavWWWRoot\my\folder</code>というパスでアクセスできる。ただし前者は<strong>トップディレクトリに関しては機能しない</strong>(アクセスできませんと言われる)ので注意。とはいえ後者はexplorerのアドレスバーが<code>http://host:port/my/folder</code>というHTTP形式の表示になってしまうのが扱いづらい。 | |||
そして、WebDAVに関しても(詳細は調べていないが)260文字程度以上の長さのフォルダにはアクセスできない。しかも、<code>\\?\UNC</code>や(ネットワークドライブを割り当てたとして)<code>\\?\</code>を付けてもアクセスできず、どうやっても表示する方法はわからなかった。また、260文字程度の長さになるファイルも表示されなくなるなどした。 | |||
長いパスのファイルを含むWebDAVサーバーをまともに使うのであれば、WinFSPなどでマウントした方が良さそうである。 | |||
== 結論 == | == 結論 == |