2013-09-25 58 views
0

我遇到罕見的情況,即寫入文件後無法立即從UNC路徑讀取文件。這裏的工作流程:C#使用FileStream將上載的文件寫入UNC,以後再讀取它有時不起作用

  1. plupload發送大文件的數據塊到的WebAPI方法
  2. 方法寫入的塊的UNC路徑(存儲服務器)。這循環直到文件完全上傳。
  3. 其他幾個操作後,同樣的方法嘗試再次讀取該文件,有時找不到文件

似乎只發生後,我們的服務器已經閒置了一段時間。如果我重複上傳幾次,它就開始工作。

我認爲這可能是一個網絡配置問題,或與文件沒有完全關閉之前再次被讀取。

下面是寫到文件中的部分代碼

SaveStream(stream, new FileStream(fileName, FileMode.Append, FileAccess.Write)); 

這裏的SaveStream定義(在這種情況下是FILESTREAM OK?):

private static void SaveStream(Stream stream, FileStream fileStream) 
    { 
     using (var fs = fileStream) 
     { 
      var buffer = new byte[1024]; 

      var l = stream.Read(buffer, 0, 1024); 
      while (l > 0) 
      { 
       fs.Write(buffer, 0, l); 
       l = stream.Read(buffer, 0, 1024); 
      } 
      fs.Flush(); 
      fs.Close(); 
     } 
    } 

下面是讀取文件的代碼:

var fileInfo = new FileInfo(fileName); 
var exists = fileInfo.Exists; 

這是fileInfo.Exists返回false。

謝謝

+0

這可能是用於處理存儲文件的硬件和軟件正在睡覺。你可以用腳本重複這個(像PS腳本)嗎? –

+0

@ChristopherStevenson - 你能否詳細說明「睡覺」? – MorganTiley

回答

1

這樣的錯誤大多是由於尚未關閉的文件。 嘗試通過文件名來SaveStream,然後用它如下:

private static void SaveStream(Stream stream, string fileName) 
{ 
    using (var fs = new FileStream(fileName, FileMode.Append, FileAccess.Write)) 
    { 
     var buffer = new byte[1024]; 

     var l = stream.Read(buffer, 0, 1024); 
     while (l > 0) 
     { 
      fs.Write(buffer, 0, l); 
      l = stream.Read(buffer, 0, 1024); 
     } 
     fs.Flush(); 
    } // end of using will close and dispose fs properly 
} 
+0

是的,我懷疑在父方法中創建的文件流不會正確處理它。 – MorganTiley

+0

啊我試過了重構,並得到了相同的效果:( 謝謝 – MorganTiley

+0

確保FileInfo.Exists()調用保證在SaveStream()調用後執行。如果這兩個調用是在單獨的Web請求中進行的,則FileInfo .Exists()可以在文件完整寫入之前調用。 – helb

相關問題