2013-11-05 43 views
0

我正在使用免費的pascal中的文件,我試圖打開一個文件,但如果它不存在,我就創建它。沒有明顯原因的運行時錯誤

這是我的代碼:

program messages; 

const PATH_ = 'data/messages/'; 

type messageFields = 
     record 
      date : String 
      ; viewed : Boolean 
      ; text : String 
      ; sender : String [ 8 ] 
     end 
    ; messagesFile = file of messageFields 
    ; 

procedure openMessagesFile (var _file: messagesFile; _fileName: String; var error: Boolean); 
    begin 
    error := false; 
    assign (_file, PATH_+_fileName); 
    {$I-} 
    reset (_file); 
    {$I+} 
    if (ioResult <> 0) then 
     error := true; 
    end; 

var _file: messagesFile 
    ; fileName: String 
    ; error: boolean; 
begin 
    readln(filename); 
    openMessageFile(_file, filename, error); 
    if (error) then 
    rewrite(_file); 
end. 

的我第一次執行程序,因爲該文件不存在,把我一個例外。 第二次,工作正常!

這是例外:

An unhandled exception occurred at $00401759 : 
EInOutError : Access denied 

回答

1

你有轉載此錯誤與確切的代碼你張貼,我實在看不出它使你得到的錯誤。我無法重現它,因爲你沒有包含使用SysUtils,你應該得到運行時錯誤5而不是EInOutError。

你的代碼有一點非常錯誤,那就是你在打開/創建它之後沒有關閉文件(儘管操作系統通常會在程序結束後清理它)。考慮到這一點以及您得到EInOutError而不是運行時錯誤5的事實,我相信您的(真實的,更大的)程序在創建它並稍後嘗試打開文件後會保持打開狀態,但由於文件已打開,因此會失敗。第二次運行程序時,文件已經創建,所以只能打開一次(用於閱讀)。

+0

我認爲,如果OS返回的復位錯誤,而沒有打開,因此不應該不會關閉? –

+0

你說得對。我知道我在這裏做了很多假設,但是我懷疑他只顯示了他原來的程序的一部分,如果我正確理解他,那麼在第一次執行時會創建該文件,儘管會引發異常。這讓我認爲,無論是什麼原因導致異常實際發生在重寫調用之後(在他的真實代碼中)。由於他的代碼在重寫後沒有關閉文件,所以他的真實代碼可能不會這樣做,他可能會嘗試做一些他在「重寫模式」中無法做到的事情。所以作爲第一步,我會確保他不會在某處丟失CloseFile。 –

1

該代碼有點不典型,但是Windows已知可以在文件關閉幾秒之後對其進行短暫的鎖定,即使它們已關閉並且Dos源代碼可能會因此而受到影響。

也許使用FPC的FileExist()直接效果更好(IIRC在Windows上,使用FindFirst基礎的,而不是根據CREATEFILE)