VB.Net File.Exists()返回True但Excel无法打开

时间:2012-12-18 14:14:06

标签: vb.net excel-2010

我使用File.Exists(filePath)检查文件是否存在。然后我尝试使用Excel.Workbooks.OpenText(filePath)从Excel中打开文件。但Excel抱怨该文件不在那里。到底是什么?

上下文是我正在炮轰另一个应用程序来处理给定文件并生成.out文件,然后我将其转换为Excel工作簿。

'' At this point, filePath is a .txt file.
Dim args As String = String.Format("""{0}""", filePath)
...
Dim exe As String = Config.ExtractEXE

Dim i As New ProcessStartInfo(exe)
i.Arguments = args

Dim p As Process = Process.Start(i)
p.WaitForExit()
...
'' filePath now becomes the .out file.
'' Then eventually, I get around to checking:
'If Not File.Exists(filePath) Then
'   MsgBox("Please ensure...")
'   Exit Sub
'End If
'' In response to an answer, I no longer check for the existence of the file, but
'' instead try to open the file.

Private Function fileIsReady(filePath As String) As Boolean
  Try
    Using fs As FileStream = File.OpenRead(filePath)
      Return True
    End Using
  Catch
    Return False
  End Try
End Function

Do Until fileIsReady(filePath)
  '' Wait.
Loop

ExcelFile.Convert(filePath...)
'' Wherein I make the call to:
Excel.Workbooks.OpenText(filePath...)
'' Which fails because filePath can't be found.

是否存在延迟问题,以便.Net在其他应用程序可以访问之前识别该文件的存在?我只是不明白为什么File.Exists()可以告诉我文件在那里然后Excel无法找到它。

据我所知,唯一可能打开文件的应用程序是我调用的应用程序进行处理。但该应用程序应该在p.WaitForExit()完成时完成该文件,对吗?

我不得不将这个应用程序部署为已知错误,这真的很糟糕。为用户提供了一个简单的解决方法;但仍然 - 这个错误不应该。希望你能帮忙。

1 个答案:

答案 0 :(得分:2)

  1. 文件是否存在并不是您是否可以打开文件的唯一因素。您还需要查看文件系统权限和锁定。
  2. File.Exists可以欺骗你(如果你传递一个目录路径,它会返回false,或者如果发生任何错误,即使该文件确实存在),
  3. 文件系统是易变的,即使在if (File.Exists(...))行和尝试在下一行中打开文件的短暂时间段内,事情也会发生变化。
  4. 总结:you should hardly ever use file.exists().几乎在你想要这样做的时候,只要尝试打开文件并确保你有一个好的异常处理程序。