2010-11-09 25 views
0

有時在運行時遇到文件未找到錯誤是很奇怪的。但我們不知道如何繞過錯誤。有一行:如何規避文件未找到錯誤?

AHash := THash.Create(); 
    assign(F,Getcurrentdir+'\data.txt'); 
    reset(F);//File not Found 
    while not EOF(F) do 
    ... 

這(錯誤)的情況並非總是如此。有時它會提示錯誤,有時它會很好地工作。 我們不知道爲什麼以及如何解決它。 非常感謝您提前。

還有一個函數可以在分配文件之前更新當前目錄。這會工作嗎?

data.txt是打包並安裝到用戶端並永久駐留在application.exe目錄中的資源。在我們的程序運行時,Getcurrentdir函數是否會更改data.txt所在的實際當前目錄?情況可能並非如此。

+1

我的建議是確保文件存在。 – 2010-12-05 17:01:41

回答

3

您可以使用FileExists(文件名)函數檢查文件是否存在。它在sysutils.pas

如果您認爲文件未找到錯誤是不正確的,也許您沒有足夠的權利來使用該文件。或者,該文件可能不在您期望的位置。

如果您認爲該文件有時僅僅因爲超出人類理解的神奇原因而「找不到」,則可以使用以下函數。但最好找到文件不存在的真實原因。

function TryOpenFile(const AFileName: string; const AMaxTries: Integer; var AFile: File): Boolean; 
var 
    tries : Integer; 
begin 
    tries := 0; 
    Result := false; 
    while not Result and (tries<=AMaxTries) do begin 
    try 
     assign(AFile,AFileName); 
     reset(AFile); 
     Result := True; 
    except 
     on e: EFileNotFoundException do begin 
     Inc(tries); 
     // Add delay if you wish. 
     end; 
    end; 
    end; 
end; 
+0

我們是否必須使用該文件存在函數,該文件是否存在於dir中。但它有時還會提示錯誤。 – Dylan 2010-11-09 14:50:59

+0

這並非總是如此。我的意思是有時候會發生,有時候可以。 – Dylan 2010-11-09 14:53:24

+0

謝謝Gamecat,我們正在測試你的代碼。 – Dylan 2010-11-09 15:08:04

3

您可以使用此:

{$I-} 
assign(F,Getcurrentdir+'\data.txt'); 
reset(F); 
if (ioResult=0) then begin 
    while not EOF(F) do 
    ... 
{$I+} 

的$ I指令將關閉自動錯誤檢查,因此你可以通過使用ioResult在自己的代碼來檢查錯誤。如果打開,則IO錯誤將導致異常。
請注意:您需要檢查每個重置/讀取/寫入語句的ioResult。

該文件可能存在,但仍然不可用,因爲用戶沒有訪問權限。

+1

對於_old_ $ I編譯器指令爲+1。 – jachguate 2010-11-09 21:27:48

+0

是的,舊的,但仍然非常有效。:-)如果我沒有弄錯的話,我已經在1988年使用了這個指令,並且使用了舊的Turbo Pascal。 (我剛剛承認我也是老了?) – 2010-11-10 09:22:48

1

GetCurrentDir()可能並不總是返回你需要的目錄 - 「當前」目錄可能已經改變。如果你想打開的文件不在那裏,爲什麼你首先使用GetCurrentDir()?確保您從其實際目錄中打開該文件。如何做到這一點取決於文件生成的方式和時間。當然,放置一些錯誤控制來處理錯誤是可以的,但是如果你期望找到這樣一個不應該發生但在「特殊」情況下發生的文件。

+0

你怎麼知道當前目錄不是@ user482742需要的?我有很多在當前目錄和GetCurrentDir()上工作的程序(在這種情況下)總是返回我需要的目錄。 – jachguate 2010-11-09 21:27:17

+2

因爲如果他沒有找到應該在那裏的文件,這意味着當前目錄可能已經被更改。它*可以改變。他詢問在分配文件之前是否有方法更新當前目錄(SetCurrentDirectory,BTW)。如果它對你有用,那是他的應用程序,而不是你的。 你怎麼知道當前目錄是他需要的?還有什麼更好? 「Circumvent」錯誤還是試圖瞭解該程序實際上正在嘗試做什麼並修復其真正原因? – 2010-11-09 22:28:51

+1

Raymond Chen有可能會在當前目錄中混淆不良行爲,Raymond Chen在此處發表了類似問題http://blogs.msdn.com/b/oldnewthing/archive/2010/11/09/10087919 .aspx – 2010-11-09 23:36:54