1

でファイルの存在を確認しますFile.Exists(filePath)。次に、Excel 内からファイルを開こうとしますExcel.Workbooks.OpenText(filePath)。しかし、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()よね?

これは既知のバグとしてアプリケーションをデプロイする必要がありましたが、これは本当に残念です。ユーザーにとって簡単な回避策があります。それでも、このバグはあってはなりません。お役に立てれば幸いです。

4

1 に答える 1

2
  1. ファイルを開くことができるかどうかは、ファイルが存在するかどうかだけではありません。また、ファイル システムのアクセス許可とロックも確認する必要があります。
  2. File.Exists は嘘をつく可能性があります (ディレクトリ パスを渡すか、ファイルが存在する場合でもエラーが発生した場合は false を返します)。
  3. if (File.Exists(...))ファイルシステムは揮発性であり、行と次の行でファイルを開こうとする間の短い期間でも状況が変化する可能性があります。

要約すると、file.exists() はほとんど使用しないでください。そのような誘惑に駆られたときはいつでも、ファイルを開いて、代わりに適切な例外ハンドラがあることを確認してください。

于 2012-12-18T14:23:09.243 に答える