假设我在Excel中打开一个文件,我知道我不能写任何东西,因为它会被Excel“锁定”。
但我可以阅读吗?或者这也不可能?
我正在使用以下代码:
If System.IO.File.Exists(file) Then
output = System.IO.File.ReadAllLines(file).ToList
If unique Then
output = output.Distinct.ToList
End If
Else
output = New Generic.List(Of String)
End If
如何让它发挥作用?
我可以在Excel中以只读方式打开文件吗?那会有用吗?
答案 0 :(得分:1)
最有可能锁定文件的其他程序,不允许其他程序执行此操作。如果是这种情况,你可以做的不多:/
查看此SO,更详细地解释:How do I open an already opened file with a .net StreamReader?
如果您是首先打开它的程序,您可以以允许其他人打开的方式打开它:)
答案 1 :(得分:1)
首先,您需要注意以下几点:
FileAccess
Enum了解详情。FileShare
Enum了解更多信息。现在AFAIK,Excel确实共享文件访问以便阅读,(但它不会分享用于写入)。因此,为了能够在Excel打开文件时访问该文件,您需要执行以下操作:
问题是,虽然File.ReadAllLines()
打开文件仅供阅读,但 不 共享对文件的访问权限以进行编写(仅供阅读)。为了澄清更多信息,File.ReadAllLines()
在内部使用StreamReader
1 ,其中 - 内部 - 使用FileStream
以下内容默认值: 2
New FileStream(path,
FileMode.Open,
FileAccess.Read, ' This is good.
FileShare.Read, ' This is the problem (see the code below).
' ...
除非文件由需要对文件进行写访问的其他进程打开,否则该文件有效。因此,您需要创建FileStream
并为FileAccess
和FileShare
枚举设置适当的值。所以,你的代码应该是这样的:
Dim output As New List(Of String)
If IO.File.Exists(file) Then
Using fs As New IO.FileStream(file,
IO.FileMode.Open,
IO.FileAccess.Read, ' Open for reading only.
IO.FileShare.ReadWrite) ' Allow access for read/write.
Using reader As New IO.StreamReader(fs)
While Not reader.EndOfStream
Dim currentLine As String = reader.ReadLine()
If unique AndAlso output.Contains(currentLine) Then Continue While
output.Add(currentLine)
End While
End Using
End Using
End If
希望有所帮助。
<强>参考文献:强>