shutil.rmtree 函數 OSError: [Errno 39] Directory not empty: 錯誤原因

         這個錯誤一般出現在 nfs 文件系統中,本人在用 flask 寫了一個文件下載程序,在下載完成之後,會有一步刪除臨時文件,該臨時文件所在的文件系統爲 nfs,於是就遇到了如上錯誤。經過查閱資料發現,這是 nfs 系統引起的。在打開一個文件時,nfs 文件系統會在文件所在的目錄生成一個 .nfs 文件,如果有文件描述符爲關閉,這時去刪除文件所在的目錄,就會發生如上錯誤。

    我當時調用的是 flask 的 send_file 函數來實現文件下載的。

try:
    response = make_response(send_file(os.path.join(tmp_dir,file_name)))
     response.headers["Content-Disposition"] = "attachment;filename=%s"%file_name
     return response
finally:
    shutil.rmtree(tmp_dir)

我覺得,在我刪除文件時, send_file 函數未釋放打開的文件描述符,所以會報如上錯誤。

可以選擇在 shutil.rmtree(os.path.join(tmp_dir),ignore_errors=True) 或 

commands.getstatusoutput("rm -rf %s" % tmp_dir) 來忽略錯誤,但是無論哪種方法,如果文件描述符未關閉,此文件所在的文件夾都是無法刪掉的。

參考:

http://stackoverflow.com/questions/11228079/python-remove-directory-error-file-exists

https://github.com/hashdist/hashdist/issues/113

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章