2017/03/13

「找不到此項目」-檔案無法刪除的問題

有次解壓縮檔案後,要執行該檔時卻出現找不檔案的問題,不能讀取也不能修改或刪除,無言,明明就活生生存在資料夾中啊!!還硬生生給我占了上GB的空間,看得到卻吃不到實在詭異。拜估狗後,果真找到解決方法,不過這方法的奧妙之處還真令人玩味,待我分曉你知!

2017-03-13_040554
▼這是google上提供解決方法,也確實有效。
2017-03-13_041552 

簡單說就是將下列二行指令複製進記事本,存檔成123.bat,再將想刪除的檔案拖到上面,就能刪除了。

DEL /F /A /Q \\?\%1
RD /S /Q \\?\%1

▼以拖拉的方式將想刪除的檔案拉到bat檔執行

2017-03-13_042607



--- 以下是深入研究,有時間才看 ---

一、為什麼檔案看得到卻吃不到?

windows裡,有些文字是禁止出現在檔名裡的,例如常見的?\/{*,而像著名網頁伺服器檔案「.htaccess」就是空白檔名加上htaccess的副檔名,是系統專門保留給伺服器的特定檔,一般使用者是沒辦法輕易建立這種檔。以今天的此案來看,檔名是「STAR-695□」,後面多了一個空白且無副檔名,無涉禁用字元照理應該是可讀取但卻無法,推測應該是有些禁用的字元沒有顯示出來(螢幕上看不到但實際上存在),導致系統在開啟該檔時自動排除該字元導致路徑錯誤而讀不到檔。所以其實只是「檔案讀取表」的問題,檔案本身並沒有壞


二、該bat檔指令代表什麼意思?

DEL /F /A /Q \\?\%1

  • del:刪除檔案
  • /F:強制刪除唯讀檔案
  • /A:根據屬性選取要刪除的檔案
  • /Q:安靜模式,不再顯示刪除確認框

RD /S /Q \\?\%1

  • rd:移除目錄 (remove directory)
  • /S:移除目錄裡所有的目錄與檔案,但不移除目錄本身
  • /Q:安靜模式,不再顯示刪除確認框

總結就是,強制刪除該目錄下的所有檔案,且不經確認,而且不會進垃圾桶會直接刪除。因為無法復原,所以要用該方法的話要先想清楚。


三、那個「\\?\%1」是什麼意思?

其實全文的重點在這,因為這個指令真的很奧妙,也滿有趣的。這裡面有包含二個指令。

\\?\

  • 「\\」是指UNC路徑(Universal Naming Convention),以雙後斜線開頭就是,如「\\192.168.1.X\sharefiles\」或「\\PC10\ShareFiles\job.doc」。所以以雙後斜線開頭指的就是網路位址(通常是區網),相對的以單後斜線開頭指的就是本機電腦路徑,如「D:\video\files\」
  • 「?」在cmd指令中是指萬用字元,代表著1個的任意字元(而*是代長n個的任意字元),但在這裡卻是特例(最討厭這種...),這裡的問號是代表著路徑長度可達到系統上限。正常的檔案路徑是260字元以內,但若以\\?\開頭的路徑卻能達到32000個字元。所以如果路徑太長或檔名無法讀取的,在路徑前加上這指令通常都能解決。

%1

  • 代表傳入的參數。你將該檔拖拉到bat,傳入的參數就是該檔案的路徑。


看個實作會較清楚,我們實際將該檔拖拉到bat上看會出現什麼指令,可藉由下 pause 指停住畫面方便觀察。

▼我們看到實際下的指令是「DEL /F /A /Q \\?\"d:\video\STAR-695 "」。第二行的RD指令因為檔案在第一行已經刪除所以找不到檔案。由此也可知前述的%1,代入的參數就是拖入的檔案的路徑。

2017-03-13_052533

這篇有更詳盡的解說:https://read01.com/J0A44P.html


四、不想刪除,只想重新命名成可讀取的檔案?

經由以上三點的功法,若我想保留珍貴的檔案不想刪除,有辦法救回嗎?答案是肯定的!將下列指令存成bat檔,再將檔案拖拉至內。

RENAME \\?\%1 123.mp4

  • 意思是:將拖入的檔案命名成123.mp4
  • 用法:rename□檔案路徑\FileName□FileNameNew

 

結語:

其實關鍵就在「\\?\」這個指令,只要在檔案路徑前加上該指令,就能夠讀取原本無法處理的檔案,知道此點後,就可以無須透過bat,直接在cmd下指令處理即可。

.

沒有留言:

張貼留言

交流溝通或良好建議 ,通通歡迎。

▋熱門文章