2008-09-26 44 views
12

打開有沒有一種方法來檢查文件是否已被重寫德爾福已經打開?檢查文件是在Delphi

代碼會去是這樣的:

AssignFile(textfile, 'somefile.txt'); 
if not textFile.IsOpen then 
    Rewrite(textFile); 

回答

15

你可以得到FILEMODE。 (有一刻,我會創建一個例子)。

TTextRec(TXT).Mode爲您提供了模式:

55216 = closed 
55217 = open read 
55218 = open write 

fmClosed = $D7B0; 
fmInput = $D7B1; 
fmOutput = $D7B2; 
fmInOut = $D7B3; 

搜索TTextRec系統單元以獲取更多信息。

+0

發生了什麼事的例子嗎? – Toby 2017-03-10 00:49:43

12

試試這個:

function IsFileInUse(fName: string) : boolean; 
var 
    HFileRes: HFILE; 
begin 
    Result := False; 
    if not FileExists(fName) then begin 
    Exit; 
    end; 

    HFileRes := CreateFile(PChar(fName) 
    ,GENERIC_READ or GENERIC_WRITE 
    ,0 
    ,nil 
    ,OPEN_EXISTING 
    ,FILE_ATTRIBUTE_NORMAL 
    ,0); 

    Result := (HFileRes = INVALID_HANDLE_VALUE); 

    if not(Result) then begin 
    CloseHandle(HFileRes); 
    end; 
end; 
+0

HFILE聲明位於何處?編輯:確定它在Windows單元中。 – grinner 2016-05-26 10:51:30

1

我發現它更容易保持一個布爾變量作爲伴侶;例如:bFileIsOpen。無論文件在哪裏打開,設置bFileIsOpen := true然後,只要您需要知道文件是否打開,只需測試此變量;例如:if (bFileIsOpen) then Close(datafile);

6

這工作得很好:

function IsOpen(const txt:TextFile):Boolean; 
const 
    fmTextOpenRead = 55217; 
    fmTextOpenWrite = 55218; 
begin 
    Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite) 
end; 
+0

這個方法在這裏幫了我很多。 – ChargerIIC 2014-06-12 14:06:20

-1

約瑟夫的回答完美的作品 - 我叫功能filenotopen,改變了行,如果

Result := (HFileRes = INVALID_HANDLE_VALUE); 

Result := NOT (HFileRes = INVALID_HANDLE_VALUE); 

我也如果沒有(結果),則刪除該行'然後開始'(和'結束')它總是關閉句柄或後續的分配和讀取給出錯誤

我現在這樣稱呼它

if filenotopen(filename) then 
    begin 
    assignfile(f,filename); 
    reset(f) 
    etc; 
    end 
else 
    message('file open by a different program') 
+0

我懷疑你引用了7是由JosephStyons的答案,也考慮到你使用的代碼風格。這個數字不是對帖子的引用,實際上可以在任何時候改變。參見[投票](http://stackoverflow.com/help/why-vote)。如果我錯誤地表達了您的意圖,請隨時回滾或拒絕我的編輯。 – Reti43 2015-01-10 11:58:09