-
Notifications
You must be signed in to change notification settings - Fork 162
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ファイルパス長が MAX_PATH を超えるファイルに関して検討する #401
Comments
議題は、ファイルパス長が
2.の「パスを扱う文字列型」は、共有メモリに突っ込むための固定長配列をstringっぽく使えるように拡張したテンプレート型なので、拡張すると共有メモリに影響が出ます。 どのように実装するかは置いておいて、 |
扱いたい場面はしばしば生まれますが、この場面が発生したときには、既に他のファイル処理系もグダグダになる事も経験済なので、世の中がみんなロングなのを扱いだしたときに考えるでもいいのかも(しばらく放置)。そのころには何か新しいアーキテクチャうまれてるかもと。 |
という事でこれに頼るのは良くないと思います。 |
ところで、C/C++で書かれた MAX_PATH 定数を使ってビルドしてるアプリは、仮にOSのAPIのMAX_PATH制限がランタイム側で解除されたとしても、対応出来ないと思います。 という事もあって個々のアプリ単位での対応になると世の中の大多数がLFN対応する頃には人類は恒星間航行を実現していると思います。 |
扱えると嬉しいなぁ・・・でも実装面倒だよなぁ・・・ というニュアンスの書込みは「MAX_PATHを超えるパス長を扱いたい」という意見にカウントしてOKですかね?w 前提として「需要のあるなし」を把握しとかないといけないと思ってます。 |
他のプログラムで長いパスを開けるかどうか試してみました。 notepad.exe開けます。ただし保存時に短いファイル名に自動的に切り詰められてしまいました。 wordpad.exe
こんなエラーメッセージが表示されました。 Visual Studio 2017Ctrl + o で開くファイルダイアログで選択して開くとアプリが異常終了しました。 フォルダを開く機能で長いパスのフォルダを開こうとすると、
と表示されました。 Visual Studio Code 1.25.0Open File で開けませんが落ちはしません。特にエラーメッセージは出ません。 Open Folder でフォルダ開いた後だと開けますし編集して保存も問題なく行えます。grepも問題無いです。 秀丸エディタ Version 8.81 送金まだ
というエラーメッセージが表示されました。課金が足りないのでしょうか…。 サクラエディタ強制終了しました。 vim (VIM - Vi IMproved 8.0)Git Bash(おそらくGit for Windowsを入れた際に付いてきた) で試したところ問題無く開いて編集&保存が出来ました。 |
Cygwin/MSYS2 自体がずいぶん前から長いパス名に対応していたと思います。なので、その上で動くVimが長いパス名を扱えても不思議ではありません。 |
ほとんどが未対応なんですねぇ・・・ん?
強制終了しちゃうのは、扱えるように「する/しない」には関係なくマズくね?という印象です。 |
その後、 http://www.kt.rim.or.jp/~kbk/zakkicho/10/zakkicho1003c.html#D20100321-3 を見るとCRT作者の Dinkumware の P.J. Plauger さんが |
今の実装は LFN 対応できていないですし対応するのも大変なので、 sLoadInfo.cFilePath = files[0].c_str(); する前にファイル名の長さをチェックして |
落書き node.jsやたら深くなる。。。 |
URL を見て嬉しくなっちゃいました。最近ずっと更新がないんですけどブックマークしてるところです。正規表現とか GREP の情報が豊富です。(雑談でした) 雑談だけではなんなので……
以前は日本語ユーザーにありがちなこととして、階層が深くなると文字数の倍の早さでサイズ上限に近づいていって、パスが長すぎるとエクスプローラーに拒絶されたものですけど、最近はそういうこともありませんね。 |
ぷろーがー先生の名前が出てくるとわw
一応フォローしておくと、Microsoftの主張は、バッファオーバーランの危険性を意識しないと気付いたときに大変なことになってしまうよ、ということで、大変な事態の回避策として危険性を意識せざるをえないバージョンの新しいCRTを提案しているわけです。正確には「Releaseでも落ちる」ではなくて「Releaseでもinvalid_parameterエラーになる」で、global handlerを登録しておけば落ちることもないです。invalid_parameterエラーはMS独自仕様で普通の例外じゃありません。専用のハンドラを書かないとキャッチできない代物ですが回避策はあります・・・もちろん、それはMicrosoftが推奨しない回避策ではあるのですが。 サクラエディタで「パスを扱うための型(≒StaticString)」が用意されている理由は、「最近使ったファイル」などの共有メモリデータを扱うのに「決まったサイズの箱」が必要だったからだと想像しています。現在のwindowsには、アプリごとの「最近使ったファイル」を管理できる機能がありますが、昔のwindowsにはそんなものありませんでした。現状のサクラエディタにはwindows側の「最近使ったファイル」の機能も一部既に取り込まれています。win7以降でタスクバーやスタートメニューのサクラエディタを右クリックすると「最近使ったファイル」が出ますよね?あれはサクラエディタの機能じゃないんです。あれはwindows標準の「ファイルを開く」ダイアログを使うアプリに与えられる恩恵の1つです。まぁ、サクラエディタは標準ダイアログをカスタマイズして使ってますけど。
|
recentフォルダにショートカットをぶち込む機能は昔からあったかも、ということに気付く・・・。 |
cygwinのこの件に関する対応は本当によくできているみたいなわかりやすくまとまっているツイートを前に見かけた気がするけど、どうにも発掘できないでいます。うーん。 node.js使ってるとあっという間にMAX_PATHは突破するんですよね。 |
git for Windows の対応について下記のページに書かれていました。 そこからリンクされている下記のコミットのメッセージに色々書かれていました。 そのコミットではスタックに確保するやり方は変えない為に
|
実装が(ちょっとは)簡単そうなのは Win 10 1607 の機能を使う方かなぁ。相対パスもそのまま使えるのだろうか? レジストリとmanifestの具体的な設定はここを参照 |
そうですね。その方法だと ただOS側のサポート具合が色々と微妙に感じました。長いパスのファイルのドラッグ&ドロップに対応していないみたいです。あとファイルダイアログでフルパスを打ち込んでも切りつめられてしまいます。将来的にはもっと改善されるのかなぁ…。 例のレジストリは自分の環境だと勝手に追加されてたんですが、多分Pythonのインストーラーが追加したのかもしれないです。そういえばPythonのインストーラーにそんな設定がありましたね。 |
|
ファイルパス長が
MAX_PATH
を超えるファイルに関して検討する#394 (comment)
The text was updated successfully, but these errors were encountered: