2009-12-08 60 views
0

我想刪除計算機上的文件,但該應用程序會引發目錄繁忙的異常。我的第一個想法是在我的課程中實現一個處理文件的方法。 知道任何人如何做到這一點?在File.Delete方法中實現IDisposable?

它實際上是一個顯示圖像的圖片框,如果您點擊圖片旁邊的按鈕,您可以將其刪除。它可以合理地阻止我的文件路徑。

picobx.Image = Image.FromFile(//path) 

有沒有解決方法?

PS。我要處置的資源,這樣我可以刪除...

這樣做:

File.Delete(// path) 
+9

如何/爲什麼你認爲實現'IDisposable'會在這種情況下幫助嗎? – LukeH 2009-12-08 14:14:35

+1

需要更多信息在這裏。你說應用程序拋出異常;是說*文件*正在使用的例外情況?你能發佈異常嗎?如果它正在使用中,是您(即您的班級)使用該文件嗎? – 2009-12-08 14:15:09

+4

處理程序的目的是釋放一個非託管資源,以便其他可能正在等待該資源的進程有可能使用它。處置者的目的不是刪除文件。就此而言,您可能會重新考慮這種設計的智慧。 – 2009-12-08 14:17:39

回答

7

Image.FromFile方法實際上鎖定了文件,這就是爲什麼你不能刪除它。最好的方式是使用bytes = File.ReadBytes(filename)作爲字節數組讀取圖像,從字節數組創建存儲器流,將存儲器流傳遞到Image.FromStream以顯示圖像,然後使用按鈕單擊將其刪除。

+0

聽起來不錯!謝謝!! – marko 2009-12-08 14:40:07

0

你打算做的是下面,我想:

try { 
    File.Delete(yourFile); 
} 
catch (IOException ex) { 
    // Do something with the exception here, like showing the user that the file can't be deleted) 
} 

的文件即正在使用中或權限不足的目錄中無法刪除。所以,如果你得到一個錯誤,你應該看看爲什麼該文件正在使用/無法訪問,無論如何。

根據您的修改,我建議做到以下幾點:

Image myImage = Image.FromFile(//path); 
picobx.Image = myImage; 

//click button 
picobx.Image = null; 
myImage.Dispose(); 
File.Delete(//path); 
+0

但這還不夠好!該應用程序應該只是工作! – marko 2009-12-08 14:28:52

+0

它不會「正常工作」,因爲你命令它,你必須符合規則和做的/。NET框架:)。 – Webleeuw 2009-12-08 14:32:00

0

行 - 我看你特林做什麼。

圖像本身實現IDisposable。您不需要自己實現IDisposable,只需確保在圖像上調用Dispose或使用「using」語法。

問題是,直到圖像 - 來自Image.FromFile(//路徑)的返回引用被丟棄,它仍然鎖定底層文件,因此您將始終得到異常「進程無法訪問文件」

0

編輯我發佈這個沒有閱讀他的新編輯:我看到你正在使用Image.FromFile。

如果文件沒有有效的圖像格式,或者如果GDI +不支持該文件的像素格式,則此方法將引發OutOfMemoryException異常。

您必須先處理圖像,然後才能刪除圖像。

Image.FromFile 

該文件保持鎖定狀態,直到圖像被丟棄。

private Image image; 
在你的圖像加載功能

image = Image.FromFile("path"); 
picobx.Image = image; 

這正好在你的刪除方法;

image.Dispose; 
File.Delete("path"); 

---不再相關---

如果你正在閱讀從流文件和流轉換爲圖像。然後你嘗試刪除文件而不關閉流,你將得到一個IOException。

System.IO.IOException:該進程無法訪問該文件「文件在這裏」,因爲它正被另一個進程使用..

和例子這可能是造成這

 StreamReader file = new StreamReader(@"C:\trans.txt"); 
     file.ReadToEnd(); 

     File.Delete(@"C:\trans.txt"); 
0

由於你建議,你將需要處理的圖像,然後才能刪除它是這樣的:

Image i = this.pictureBox1.Image; 
this.pictureBox1.Image = null; 
i.Dispose(); 
File.Delete(filePath); 
相關問題