2016-07-16 82 views
0

空的,所以,我需要清理的目錄不爲空。 我已經創建瞭如下function.For測試的原因我想刪除JDK安裝刪除目錄,是不是在蟒蛇

def clean_dir(location): 
    fileList = os.listdir(location) 

    for fileName in fileList: 
     fullpath=os.path.join(location, fileName) 
     if os.path.isfile(fullpath): 
      os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) 
      os.remove(location + "/" + fileName) 
     elif os.path.isdir(fullpath): 
      if len(os.listdir(fullpath)) > 0: 
       clean_dir(fullpath) 
      #os.rmdir(location + "/" + fileName) 
      shutil.rmtree(location + "/" + fileName) 

    return 

我試圖用rmtree和rmdir,但它失敗。

我得到了使用rmtree的錯誤是:

OSError: Cannot call rmtree on a symbolic link

這是當我用命令rmdir我得到了錯誤:

OSError: [Errno 66] Directory not empty: '/tmp/jdk1.8.0_25/jre/lib/amd64/server'

代碼正常的窗口。但由於某種原因,它在Linux上失敗。

+0

你在一個符號鏈接,而不是一個目錄指向rmtree。 https://en.wikipedia.org/wiki/Symbolic_link – iScrE4m

+0

如果它是一個符號鏈接,我想'os.unlink(...)'是你所需要的。 (爲了澄清,這將只是刪除符號鏈接。它不會刪除任何符號鏈接指向的內容。) – smarx

+0

IIRC,'os.unlink'應該刪除的文件。 – kronenpj

回答

1

kronenpj感謝,認爲他的想法。但是當你有一個符號鏈接的時候,它試圖刪除是一個正常的文件並且失敗。我不得不添加一個新的elif並添加取消鏈接選項符號鏈接

 
def clean_dir(location): 
    fileList = os.listdir(location)

for fileName in fileList: fullpath=os.path.join(location, fileName) if os.path.isfile(fullpath): os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) os.remove(os.path.join(location, fileName)) elif os.path.islink(fullpath): os.unlink(fullpath) elif os.path.isdir(fullpath): if len(os.listdir(fullpath)) > 0: clean_dir(fullpath) #os.rmdir(location + "/" + fileName) shutil.rmtree(os.path.join(location, fileName)) return

+0

絕對正確,我不確定是否remove()會正確處理符號鏈接。 – kronenpj

2

您遇到的方式在Windows和Linux(UNIX真)處理的文件系統之間的區別之一。我相信,增加一個額外的情況下,以您的代碼將至少幫助:

... 
for fileName in fileList: 
    fullpath = os.path.join(location, fileName) 
    ## |<-- Handle symlink -->| 
    if os.path.islink(fullpath) or os.path.isfile(fullpath): 
     os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) 
     os.remove(os.path.join(location, fileName)) 
    elif os.path.isdir(fullpath): 
     if len(os.listdir(fullpath)) > 0: 
      clean_dir(fullpath) 
     #os.rmdir(os.path.join(location, fileName)) 
     shutil.rmtree(os.path.join(location, fileName)) 
... 

這應該妥善處理好其中的條目是一個符號鏈接的情況下,將其取下就像一個文件。我不知道該chmod是必要的 - 它可能工作在鏈接的目標,但它不應該傷害來處理它的方式與文件相同。

但是,我只是檢查並且os.path.file針對符號鏈接返回指向的「事物」的類型,因此需要額外的檢查來區分鏈接本身和指向的事物。同樣爲了便於攜帶,而不是追加「/」,如上面新編輯的那樣使用os.path.join