15

有没有办法检查文件是否已被 Delphi 中的 ReWrite 打开?

代码会是这样的:

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

5 回答 5

17

你可以得到文件模式。(一会儿,我将创建一个示例)。

TTextRec(txt).Mode 为您提供模式:

55216 = closed
55217 = open read
55218 = open write

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

在系统单元中搜索 TTextRec 以获取更多信息。

于 2008-09-26T19:11:16.857 回答
13

试试这个:

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;
于 2008-09-26T19:17:26.733 回答
9

这工作正常:

function IsOpen(const txt:TextFile):Boolean;
const
  fmTextOpenRead = 55217;
  fmTextOpenWrite = 55218;
begin
  Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite)
end;
于 2011-11-17T11:29:31.053 回答
1

我发现将布尔变量作为伴侣更容易;例子:bFileIsOpen。无论文件在哪里打开,bFileIsOpen := true然后设置,每当您需要知道文件是否打开时,只需测试此变量即可;例子:if (bFileIsOpen) then Close(datafile);

于 2011-10-11T17:47:13.427 回答
-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')
于 2015-01-10T11:29:37.357 回答