簡體   English   中英

進程無法訪問文件 <filepath> 因為它正在被另一個進程使用

[英]The process cannot access the file <filepath> because it is being used by another process

我在ASMX網絡服務上上傳了大文件,將其分成大塊(小部分)(asmx不支持流式傳輸,我找不到另一種方式):

bool UploadChunk(byte[] bytes, string path, string md5)
{
      ...
      using (FileStream fs = new FileStream(tempPath, FileMode.Append) )
      {   
            fs.Write( bytes, 0, bytes.Length );
      }
      ...
      return status;
}

但是在〜20-50調用之后的某些文件上,我捕獲了此錯誤:
該進程無法訪問該文件,因為該文件正在被另一個進程使用。

我懷疑與Windows相關的文件無法實現。 有什么辦法擺脫這個無聊的錯誤嗎?

編輯
請求順序地和同步地執行



編輯2

客戶代碼如下:

_service.StartUpload(path);

...
do
{
..
bool status = _service.UploadChunk(buf, path, md5);
if(!status)return Status.Failed;
..
}
while(bytesRead > 0);

_service.CheckFile(path, md5);

每個請求都是獨立處理的。 仍在訪問文件的過程可能是先前的請求。

通常,您應該使用文件傳輸協議來傳輸文件。 ASMX對此不利。

而且,我認為您有充分的理由不使用WCF?

發生錯誤時,請使用WhoLockMe來檢查誰在使用該文件。 您可以將應用程序置於調試模式並按住斷點來執行此操作。 這很可能是您的過程。

另外,請嘗試在每次傳輸之后(以及下一次傳輸之前)添加延遲,以查看是否有幫助。 也許您的傳輸速度太快,下一次傳輸進來時,流仍在使用中或被沖洗。

用它來創建文件

如果您想附加一些內容,請添加FileMode.Append

var filestreama = new FileStream(name, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

選項1:更改需求,因此您不必使用ASMX進行更改。 WCF支持我將要試驗的流模型,但是對於您想要的模型,它應該更加有效。

選項2:研究WSE 3.0。 我沒看太多,但是我認為它擴展了ASMX Web服務以支持DIME和MTOM之類的東西,這些東西旨在傳輸文件,因此可能會有所幫助。

選項3:設置系統,以便每個調用將文件的一部分寫入不同的文件名,然后編寫代碼以重新加入所有內容。

暫無
暫無

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

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