[Python] shutil.rmtree() 無法處理 symbolic link to folder

[Python] shutil.rmtree() 無法處理 symbolic link to folder

今天同事回報了一個問題,說 shutil.rmtree() 丟出了一個 exception,

說是 rmtree 不能用在 symbolic link 上面…

看了一下,程式的邏輯是先用 os.path.isdir() 看是不是目錄,

如果是目錄的話,就呼叫 shutil.rmtree() 去砍~

>>> os.path.isdir("zzz")
True
>>> import shutil
>>> shutil.rmtree("zzz")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 232, in rmtree
onerror(os.path.islink, path, sys.exc_info())
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 230, in rmtree
raise OSError("Cannot call rmtree on a symbolic link")
OSError: Cannot call rmtree on a symbolic link

 

這邏輯看起來沒什麼問題,只是遇到 symbolic link 指向目錄的話,

os.path.isdir() 還是傳回 True,而 shutil.rmtree() 不能用在這樣的 symbolic link file 上面~

想來是 shutil.rmtree() 也不能確定呼叫的人到底是想砍 symbolic link 本身,

還是想砍連結到的目錄…

 

以那個 case 的使用方式來說,我們只是要確保指到的路徑會消失就行,

不管它是檔案還是目錄還是 symbolic link…

用醜一點的方式來解決吧,檢查路徑到底是哪種東西,再決定怎麼砍: 

if os.path.islink(file_path):
os.remove(file_path)
elif os.path.isdir(file_path):
import shutil
shutil.rmtree(file_path)
else:
# It is a file
os.remove(file_path)

 

其實如果 python 有提供一個萬能的砍檔案/目錄/symbolic link 的函式就好了… 😛

 

(本頁面已被瀏覽過 1,236 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料