簡體   English   中英

錯誤:進程無法訪問文件“...”,因為它正由另一個進程使用

[英]Error: The process cannot access the file '…' because it is being used by another process

我有一個函數,總是創建一個目錄,並在其中放入一些文件(圖像)。 當代碼第一次運行時,沒問題。 第二次(總是),當我必須刪除目錄時會出錯(因為我想重新創建它以將圖像放入其中)。 錯誤是“進程無法訪問文件'...',因為它正被另一個進程使用”。 訪問此文件的唯一進程是此函數。 這就像功能“不離開”文件。

如何通過明確的解決方案解決這個問題?

這里是代碼的一部分:

String strPath = Environment.CurrentDirectory.ToString() + "\\sessionPDF";
if (Directory.Exists(strPath))
      Directory.Delete(strPath, true); //Here I get the error
Directory.CreateDirectory(strPath);
//Then I put the files in the directory

如果您的代碼或其他進程正在提供圖像,它們將被無限期鎖定。 如果它是IIS,它們在服務時會被鎖定很短的時間。 我不確定這一點,但如果資源管理器為圖像創建拇指,它可能會鎖定文件。 它可能是一瞬間,但如果你的代碼和那個進程發生碰撞,那就是競爭條件。

完成后一定要釋放鎖。 如果該類實現了IDisposable,如果您沒有對該對象進行大量工作,請在其周圍包裝using語句:

using (var Bitmap = ... || var Stream = ... || var File = ...) { ... }

...之后將關閉對象,文件將不會被鎖定。

只是在這里沒有看到轉儲文件的代碼,但是如果你正在使用FileStreamsBitmap對象,我會仔細檢查以確保在運行第二種方法之前正確處理所有這些對象。

在這種情況下唯一明確的解決方案是通過釋放該訪問來跟蹤誰正在處理對目錄的訪問並修復錯誤。

如果處理訪問的對象/資源是第三方,或以任何方式無法更改或訪問,則需要修改體系結構,以不同的方式處理IO訪問。

希望這可以幫助。

聽起來好像在創建文件時沒有釋放文件句柄。 嘗試在using語句中執行所有IO,這樣文件將在您完成后自動釋放。

http://msdn.microsoft.com/en-us/library/yh598w02%28v=vs.80%29.aspx

  • 我見過病毒掃描程序會掃描新文件並阻止文件被刪除的情況,盡管這種可能性很小。

  • 一定要.Dispose所有的IDisposable對象,並確保一切都沒有改變你的Environment.CurrentDirectory您要刪除的目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM