File.ReadAllLines()无法从Excel打开的文件中读取

时间:2018-05-04 17:41:01

标签: .net vb.net file.readalllines

假设我在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中以只读方式打开文件吗?那会有用吗?

2 个答案:

答案 0 :(得分:1)

最有可能锁定文件的其他程序,不允许其他程序执行此操作。如果是这种情况,你可以做的不多:/

查看此SO,更详细地解释:How do I open an already opened file with a .net StreamReader?

如果您是首先打开它的程序,您可以以允许其他人打开的方式打开它:)

答案 1 :(得分:1)

首先,您需要注意以下几点:

  • 每当进程/线程打开文件时,进程/线程可以访问文件以进行只读,仅写入,或同时访问两者。查看FileAccess Enum了解详情。
  • 此外,进程/线程可以指定是否共享对文件的访问(例如,共享用于只读,仅用于写入,用于两者,或者根本不共享访问)。查看FileShare Enum了解更多信息。
  • 如果其他进程根本没有共享文件的访问权限,那么无论是阅读还是写作,您都无法访问该文件。

现在AFAIK,Excel确实共享文件访问以便阅读,(但它不会分享用于写入)。因此,为了能够在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并为FileAccessFileShare枚举设置适当的值。所以,你的代码应该是这样的:

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

希望有所帮助。

<强>参考文献:

1 InternalReadAllLines() source.

2 StreamReader internal constructor source.