C#同一进程中用两个FileStream打开文件报错如何解决?
文件被占用错误的原因及修复方案
错误原因
问题出在两个FileStream的共享权限不兼容:
- 第一个流以
FileAccess.Write打开文件,同时设置FileShare.Read——这个参数的含义是:允许后续打开该文件的请求拥有读权限,但当前流自身处于只写状态。 getChecksum里的第二个流以FileAccess.Read打开,设置的FileShare.Read表示:该流打开后,后续其他请求仅能读取文件。但此时第一个流已经以写权限占用了文件,第二个流的FileShare.Read没有允许已存在的写操作,系统判定权限冲突,因此抛出“文件被其他进程占用”的错误。
简言之:第二个流的共享规则没有包容第一个流的写权限,导致无法正常打开文件。
修复方案
修改getChecksum方法中FileStream的FileShare参数为FileShare.ReadWrite,让它允许已存在的流拥有写权限:
public long getChecksum(string source){ using (var fs = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){ // 这里编写计算校验和的逻辑 } }
修改后,第二个流打开时会兼容第一个流的写操作,就能正常读取文件计算校验和了。
补充说明:FileShare参数的核心作用是定义当前流打开后,允许其他后续打开请求拥有的权限,同时必须兼容已存在的流的访问权限。当已有流持有写权限时,新打开的流必须在FileShare中包含Write,才能成功打开文件。
内容的提问来源于stack exchange,提问作者TikTokExperience
相关产品推荐
相关产品推荐

