2017年5月15日月曜日

メモ: Win10でフォルダ名の末尾に「.」が付いてるとエクスプローラからはおろかコマンドプロンプトからも普通には削除できなくなる

twitterを見ていると次のような投稿が目にとまりました。
Unity仙人‏ @lucifuges
https://twitter.com/lucifuges/status/863726956293922816

Win10でフォルダ名の末尾に「.」が付いてるとエクスプローラからはおろかコマンドプロンプトからも普通には削除できなくなるという21世紀にあるまじきクソ仕様を踏んで半べそかいてた。解決法はパス指定の前に\\?\とかいう謎記号を付けること。rd "\\?\C:\dir."みたいな。
フォルダの末尾に「.」 を付けると扱いが難しいことや、「\\?\」という記法は知りませんでした。

こちらに対して以下のような情報が提供されていました。
tomokisanaki‏ @tomoki0sanaki
https://twitter.com/tomoki0sanaki/status/863911178023477248

"5.パス名の末尾の「.」や半角スペースが無視されない" ですねー。 → 「IPA ISEC セキュアプログラミング講座 ver1 8.1 Windowsパス名の落とし穴 http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b08_01.html …」の「サービス機能の不活性化」
リンク先の該当する記述を以下に引用します。
Windowsパス名の落とし穴  
http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b08_01.html

サービス機能の不活性化
多くの自由度を持つWin32のパス名を相手にするには複雑なロジックのプログラムが必要になるが,パス名の解釈に伴う「サービス機能」の多くを不活性化する特殊な指定方法がある。それはパス名の先頭に「\\?\」という4文字を付け加えることである。たとえば,
pfile = fopen ("d:\\dir\\data.txt", "r"); 
の代わりに
pfile = fopen ("\\\\?\\d:\\dir\\data.txt", "r"); 
のようにするのである。
 
\\?\」から始まるパス名についてはサービス機能が次のようにはたらかなくなる。
  1. ディレクトリ区切り文字「/」が使用できない。
  2. ディレクトリ区切り文字の重複「\\」(C/C++の文字列定数内では"\\\\")が許されない。
  3. パス名の途中に「\.\」を差し挟めない。
  4. パス名の途中に「\..\」を差し挟めない。
  5. パス名の末尾の「.」や半角スペースが無視されない。
知りませんでした。何かあったときはこのメモを見ることにします