2012-06-02 66 views
3

刪除test文件夾IHAVE項目設置這樣不能在Windows 7

project/src/test/python/main.py 
project/test-output 

我想主testscript刪除,然後重新創建測試輸出文件夾。

所以我把這個代碼放在那裏。

if os.path.exists("test-output"): 
    shutil.rmtree("test-output") 
os.mkdir("test-output") 

但是當我

d:\projects\thisproject>python src\test\python\main.py 

運行它,我得到一個訪問從Windows否認錯誤。 [錯誤5]

如何解決這個問題?

mkdir命令工作良好。

+0

拒絕訪問什麼命令(rmtree或MKDIR)?並在什麼路徑(d:\ projects \ thisproject?)?請包括* full *回溯。 – uselpa

回答

0

最有可能的是使用該文件夾 - 通過打開位於該文件夾內的文件或通過將該文件夾或其子文件夾作爲其當前工作目錄。

2

我最近在Windows 7下看到了shutil.rmtree()自己的這種行爲,同時在單元測試中創建和銷燬測試文件夾。而且,不,沒有任何活動引用該目錄或其中的任何內容,甚至沒有瀏覽器窗口。我的「解決方案」(如果你可以稱呼它)是應該做:

shutil.rmtree("my/test/dir", ignore_errors=True) 

不完全是一個美麗的事情,但它解決了這個問題對我來說。

順便說一句,這是一個64位的Windows 7機器和SSD。同事在另一臺計算機上的Windows共享中刪除目錄時,會報告與shutil.rmtree()相同的問題。我感覺Windows只是簡單地在這裏緩存一些東西。

1

Windows只會將文件/目錄標記爲'close on close',與unlink不同,unlink會立即從視圖中刪除項目。請參閱MSDN中Remove Directory函數的文檔。因此,如果任何進程(例如資源管理器窗口,全文索引器或病毒掃描程序)仍然具有打開的文件句柄,則會失敗。

因此,即使您忽略了刪除錯誤,您仍然會在os.mkdir步驟中失敗。一個簡單的解決方法是不重新創建該目錄,而是簡單地刪除其所有內容。另一種是在幾秒鐘後等待並重試操作。

圍繞該限制的最佳方法是對每次運行使用不同的輸出文件夾(通過tempfile.makedtemp())。當最後一個引用消失時,您的刪除操作將會啓動,但您的重新創建永遠不會失敗。

0

試試這個:

def renewDir(name): 
    while 1: 
     try: 
      if os.path.exists(name): 
       shutil.rmtree(name) 
      os.makedirs(name) 
      break 
     except: 
      pass