2012-12-18 57 views
1

我檢查文件是否存在File.Exists(filePath)。然後我嘗試從Excel.Workbooks.OpenText(filePath)的Excel內打開文件。但Excel抱怨文件不在那裏。有沒有搞錯?VB.Net File.Exists()返回True,但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()時完成,對嗎?

我不得不將這個應用程序作爲一個已知的bug部署,這真的很糟糕。對用戶來說有一個簡單的解決方法。但仍然 - 這個錯誤不應該。希望你能幫助。

+1

此時該文件是否被另一個應用程序打開?例如。一個獨立的Excel? –

+0

@Trekstuff,請參閱我在問題中添加的評論以迴應您的問題。謝謝! –

回答

2
  1. 是否存在文件不是您是否可以打開文件的唯一因素。您還需要查看文件系統權限和鎖定。
  2. File.Exists可能騙你(如果你通過一個目錄路徑或者如果有錯誤發生,即使文件存在,它也會返回false)
  3. 文件系統是不穩定的,即使在簡要期間介於if (File.Exists(...))行和嘗試打開下一行中的文件。

總結:you should hardly ever use file.exists().幾乎任何時候你都會這麼做,試着打開文件並確保你有一個好的異常處理程序。

+0

哇。這是我第一次聽說不依賴於File.Exists()。這是一個無賴。但是我根據我在鏈接中讀到的內容對代碼進行了更改。請查看我的問題以瞭解更改。結果是一樣的。 ( –

+1

)我想你錯過了這一點,不要使用像FileIsReady()這樣的函數,你需要把你的調用放在try/catch塊的excel中 –

+0

啊,我明白了,你是對的 - 我沒有想到這一點,任何關於爲什麼Excel無法打開那裏的文件的想法?假設我將圍繞Excel代碼包裝一個異常處理程序,它仍然會導致無法打開文件。還有,我需要壓扁這個bug! –

相關問題