我有这个代码,我打开一个流(没有关闭或处理它),然后我复制流使用的文件,我想我应该得到一个“进程无法访问文件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);
答案 0 :(得分:1)
可以锁定文件进行编辑或锁定以进行阅读,或两者兼而有之。您只需要读取文件即可复制它,只需打开文件就不会自动将其锁定以供阅读。如果你读到底层win32 api如何处理文件锁,你会得到更好的图片,这是一个很好的起点:LockFileEx Function。
答案 1 :(得分:1)
这是因为 StreamWriter 使用FileStream对象,FileStream构造函数上的默认FileShare未指定显式文件共享是 FileShare.Read 。
允许随后打开文件进行阅读。如果未指定此标志,则在文件关闭之前,任何打开文件以供读取(通过此进程或其他进程)的请求都将失败。但是,即使指定了此标志,仍可能需要其他权限才能访问该文件。
您可以使用FileStream构造函数覆盖它,该构造函数允许指定FileShare,然后将其传递给StreamWriter构造函数。
答案 2 :(得分:0)
我认为这取决于源文件的打开方式。我的意思是,如果它已共享阅读。