File.Copy与打开的流没有崩溃。知道为什么?

时间:2010-03-19 21:55:46

标签: c#

我有这个代码,我打开一个流(没有关闭或处理它),然后我复制流使用的文件,我想我应该得到一个“进程无法访问文件somefile.xml因为它正被使用通过另一个过程“例外,但我没有。知道为什么吗?谢谢!代码:

StreamWriter writer = new StreamWriter("C:\\somefile.xml");

writer.Write(string.Empty);

// I thought this should crash since a stream is using "C:\somefile.xml"
File.Copy("C:\\somefile.xml", "C:\\copy of somefile.xml", true);

3 个答案:

答案 0 :(得分:1)

可以锁定文件进行编辑或锁定以进行阅读,或两者兼而有之。您只需要读取文件即可复制它,只需打开文件就不会自动将其锁定以供阅读。如果你读到底层win32 api如何处理文件锁,你会得到更好的图片,这是一个很好的起点:LockFileEx Function

答案 1 :(得分:1)

这是因为 StreamWriter 使用FileStream对象,FileStream构造函数上的默认FileShare未指定显式文件共享是 FileShare.Read

  

允许随后打开文件进行阅读。如果未指定此标志,则在文件关闭之前,任何打开文件以供读取(通过此进程或其他进程)的请求都将失败。但是,即使指定了此标志,仍可能需要其他权限才能访问该文件。

您可以使用FileStream构造函数覆盖它,该构造函数允许指定FileShare,然后将其传递给StreamWriter构造函数。

答案 2 :(得分:0)

我认为这取决于源文件的打开方式。我的意思是,如果它已共享阅读。