Excel锁定文件后File.ReadAllLines读取失败的解决方法咨询
你的问题核心在于File.ReadAllLines的默认行为和Excel的文件锁机制冲突了,我来一步步给你理清:
为什么你的代码会失败?
File.ReadAllLines默认会请求独占文件访问权限(对应FileShare.None参数),意思是它要求完全掌控这个文件,不允许任何其他程序同时持有文件锁。但当Excel以常规编辑模式打开文件时,它会持有文件的写锁来防止其他程序修改,这就导致你的代码无法获取独占权限,最终抛出异常。
解决方案1:修改代码的文件读取方式
你需要手动指定文件共享模式,允许在Excel持有锁的情况下读取文件。下面是调整后的VB.NET代码,用FileStream配合FileShare.ReadWrite来实现:
Dim output As New Generic.List(Of String) If System.IO.File.Exists(file) Then ' 以只读方式打开文件,允许其他程序同时读写该文件 Using fs As New System.IO.FileStream(file, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite) Using sr As New System.IO.StreamReader(fs) Dim line As String While (line = sr.ReadLine()) IsNot Nothing output.Add(line) End While End Using End Using If unique Then output = output.Distinct().ToList() End If Else output = New Generic.List(Of String) End If
这里的FileShare.ReadWrite告诉系统:我们只需要读取文件,允许其他程序(比如Excel)继续持有读写锁,这样两者就能共存了。
解决方案2:让Excel以只读模式打开文件
这绝对是可行的!当你选择以只读模式打开Excel文件时,Excel只会持有文件的读锁,不会阻止其他程序读取甚至修改文件(当然Excel自己没法保存修改到原文件)。此时你的原始File.ReadAllLines代码应该就能正常运行——因为Excel没有占用排他性的文件权限。
操作起来很简单:右键点击文件→选择「打开方式」→「Excel」,在弹出的提示窗口里选择「只读」即可;或者在Excel里通过「文件→打开」,选中文件后点击右下角的「打开」下拉菜单,选择「只读打开」。
额外提醒
如果Excel是通过独占模式打开文件(比如文件本身设置了独占属性,或者Excel选项里开启了强制独占打开),那即使使用FileShare.ReadWrite也可能无法读取。这种情况下,切换到只读模式打开Excel是最直接的解决办法。
内容的提问来源于stack exchange,提问作者user4234

