2013-09-25 21 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

相关问题