2010-04-19 65 views
9

我有这个保存pdf文件的代码。FileStream保存文件,然后立即在.NET中解锁?

FileStream fs = new FileStream(SaveLocation, FileMode.Create); 
fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length); 
fs.Flush(); 
fs.Close(); 

它工作正常。但是有时它不会立即释放锁,并且会导致文件锁定异常,并且在这一次运行后运行函数。

是否有释放文件锁定之后fs.Close()

+1

是本地硬盘驱动器还是网络共享文件?你有没有安装任何防病毒软件? – 2010-04-19 20:39:15

回答

16

这里,理想的方式是理想的:

using (var fs = new FileStream(SaveLocation, FileMode.Create)) 
{ 
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length); 
} 

这大致相当于:

FileStream fs = null; 
try 
{ 
    fs = new FileStream(SaveLocation, FileMode.Create); 
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length); 
} 
finally 
{ 
    if (fs != null) 
    { 
     ((IDisposable)fs).Dispose(); 
    } 
} 

using更具可读性。


UPDATE:

@aron,现在我想

File.WriteAllBytes(SaveLocation, result.DocumentBytes); 

看起来比理想的:-)更漂亮的眼睛

+9

这是如何使用'using'语句的一个很好的例子,但是由于它最终等同于OP的代码,所以它没有解决被问到的问题。 – 2010-04-19 20:09:37

+3

@Jeffrey,我知道我喝了很多啤酒,但我真的不知道这是如何等同于OPs代码。 – 2010-04-19 20:10:26

+5

处理通话关闭。关闭通话冲洗。最终结果是一样的。如果发生异常或早期返回,您的更改是非常人性化的,以避免意外断开文件,但它不会导致文件锁定更快地被移除。基本功能相当于 – 2010-04-19 20:15:31

3

我无法想象为什么在文件关闭后锁会被保留。但是,你应该考虑在使用statment包装是为了确保即使抛出一个异常

using (FileStream fs = new FileStream(SaveLocation, FileMode.Create)) 
{ 
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length); 
} 
3

如果这一个后运行的功能是相同的应用程序的一部分,那么一个更好的办法的文件被关闭在整个过程开始时打开文件进行读取/写入,然后将文件传递给每个函数,而不关闭文件直到过程结束。然后,应用程序将无需阻止等待IO操作完成。

5

我们已经在生产中看到了同样的问题,用using()语句包装它。

这里的头号凶手之一是反病毒软件,它可以在文件关闭后潜入,在发布前检查它是否包含病毒。

即使所有的反病毒软件混合在一起,在网络共享存储文件的非常高负载的系统中,我们偶尔也会看到这个问题。 A,咳嗽,短Thread.Sleep(),咳嗽后,关闭似乎可以治愈它。如果有人有更好的解决方案,我很乐意听到它!

+0

你会推荐多少毫秒? – kpozin 2011-11-11 14:54:10

+0

很难推荐具体的价值,因为它取决于很多因素;从小开始,比如说10。 – 2011-11-11 18:02:44

1

这对我使用.Flush()时有效,我必须在using语句中添加一个close。

using (var imageFile = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite)) 
{ 
    imageFile.Write(bytes, 0, bytes.Length); 
    imageFile.Flush(); 
    imageFile.Close(); 
    } 
+0

当我在'using'里面使用'WhiteAsync'时,我也必须这样做。 – codenamezero 2017-10-13 19:01:41

相关问题