同事問了一個鬼問題 - "Windows 檔名可不可以只有一個空白?"

答案是可以。測試過程我搞出一個怎麼都砍不掉的檔案,花了點時間才清掉,學到冷知識。

依據微軟文件,檔案或目錄名稱不能包含以下字元:

  • < (less than)
  • > (greater than)
  • : (colon)
  • " (double quote)
  • / (forward slash)
  • \ (backslash)
  • | (vertical bar or pipe)
  • ? (question mark)
  • * (asterisk)

所以空白是合法的字元,像是 "Hello World.txt" 完全沒問題,但文章有提到不要用空白或點做結尾,對檔案系統雖然合法,但 Windows Shell 或檔案總管無法支援,所以如果你想惡搞同事,可以這麼做。在他的資料夾生出三個名為" . "、" .. "、"來刪我呀,笨蛋!. "的空檔:

這三個檔案對檔案總管來說是隱形的,看得到刪不掉:

" . " 跟 " .. " 更玄,會出現被其他應用程式開啟無法刪除的訊息:

學駭客用 DOS 下指令,總能成功吧?不行!

啃,難道要逼我格式化磁碟才能刪掉它們?前面提的微軟文件有答案,有個特殊字首 - "\\?\",加在路徑前方會跳過 Windows Shell 或檔案總管的路徑字串解析或檢核,直接送交 Windows API 執行,可解決路徑超過 MAX_PATH 長度限制或前面所說"."結尾檔名等 GUI 無法處理的特殊狀況。所以,加上"\\?\"就能順利解決這些垃圾囉~

又學到一些冷知識。

Filename ending with '.' can't be deleted by Windows GUI or shell, \\\\?\\ prefix is required to access them.


Comments

# by Leo

學到新知識了,謝謝

# by Leo

學到新知識了,謝謝!

# by Guest

del *.* 呢?

# by ByTIM

那能改回正常的檔名,然後刪除嗎?

# by pjw

我怎麼無法建立三個示範的空檔...

# by 小白

感謝學到冷知識 另外補個LINUX遇到這類問題的解法 當有 "\." ".." 或" " 檔案的時候,可以用反斜線測看看 ex. rm \\. \\.. "\ " 當有 "-" 開頭的時候 建議使用rm -- "-檔名"

# by Dxball

@pjw (type nul)>"\\?\D:\foo\ .. " 就會在 D:\foo 下建立一個名叫 " .. " 的空檔案 用 win32 api 的 CreateFile 也可以

# by USER

請問你的 CMD 終端機是用哪個程式?

# by QUQ

我是用WIN7 我測試可以直接刪除啊.....

# by Jeffrey

to USER, 下 DOS 指令是用 Cmder,大推大推再大推! https://blog.miniasp.com/post/2015/09/27/Useful-tool-Cmder

# by Ike

@Jeffrey 黑大是不是也有用 Windows Terminal 不知有沒有 Cmder 與 Windows Terminal 的比較心得

# by Jeffrey

to lke, 不用比較,做成瀨尿牛丸就成了。我在 Windows Terminal 也會整合 Cmder,比 CMD 好用很多(尤其 git Branch 及狀態顯示,超重要),Windows Terminal (以下簡稱 WT) 的分割視窗是強項,但整合 Cmder 啟動速度稍慢,簡單操作我會開 Cmder 就好。

# by Nye

等等,那個以下簡稱WT沒有以下... XD

Post a comment