无法打开文件stream的阅读,但我仍然能够复制文件?

这一行:

using (FileStream fs = File.Open(src, FileMode.Open, FileAccess.Read, FileShare.Read)) 

抛出:

System.IO.IOException:进程无法访问文件“X”,因为正在被另一个进程使用。

当我用下面的行代替行:

 File.Copy(src, dst, true); using (FileStream fs = File.Open(dst, FileMode.Open, FileAccess.Read, FileShare.Read)) 

有用。

但是为什么我可以复制,它肯定会读取文件的全部内容,而不能直接读取文件呢? 有没有解决方法?

当您打开文件时,会检查访问模式和共享模式。 任何进程的访问方式必须与其他方式的共享方式兼容。 所以如果A想访问阅读,其他人必须允许阅读共享模式。 写作也一样。

如果进程A已经打开一个文件进行写入,并且您说SharingMode.Read则调用将失败。 你在这种情况下说“别人只能从文件中读取,而不能写入”。

如果你指定ShareMode.ReadWrite你说“别人可以读或写,我不在乎”,如果没有其他进程指定ShareMode.Write你可以从文件中读取。

但为什么我可以复制,这肯定会读取文件的全部内容

那么从概念上讲,它会读取整个文件,虽然它可能发生在比复制流更低的层次上。 在Windows上,调用CopyFileEx系统函数,传入路径。 在* nix系统上,它也使用系统调用,但是用FileAccess.Read, FileShare.Read打开源文件,这样你就会遇到同样的问题。

而被限制直接阅读文件?

如果一个文件可能被写入,那么你不能打开它FileShare.Read因为在你做的各种操作之间的某个时刻,文件可能会改变,你的操作会给出错误的结果。

CopyFileEx可以通过防止在操作的短时间内发生的任何写入影响结果而成功。 没有办法提供这种更一般的形式,因为没有办法知道你会迅速关闭它的流。

有没有解决方法?

解决方法是什么? 你不能打开一个流,或者你可以复制文件? 对于前者,后者提供了一个这样的解决方法:复制文件以获得它是如何的快照,但是注意不能保证。