문제

델파이에서 다시 쓰기로 파일이 열렸는지 확인하는 방법이 있습니까?

코드는 다음과 같이 진행됩니다.

AssignFile(textfile, 'somefile.txt');
if not textFile.IsOpen then
   Rewrite(textFile);
도움이 되었습니까?

해결책

filemode를 얻을 수 있습니다. (한 순간, 예를 만들 것입니다).

ttextrec (txt) .mode는 모드를 제공합니다.

55216 = closed
55217 = open read
55218 = open write

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

자세한 내용은 시스템 장치에서 TTEXTREC를 검색하십시오.

다른 팁

이 시도:

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;

이것은 잘 작동합니다 :

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

나는 부울 변수를 동반자로 유지하는 것이 더 쉽다는 것을 알았습니다. 예시: bFileIsOpen. 파일이 열리는 곳마다 설정하십시오 bFileIsOpen := true 그런 다음 파일이 열려 있는지 알아야 할 때 마다이 변수를 테스트하십시오. 예시: if (bFileIsOpen) then Close(datafile);

조셉의 대답은 완벽하게 작동합니다 - 나는 그 기능을 불렀다. filenotopen 그리고 라인을 변경했습니다

Result := (HFileRes = INVALID_HANDLE_VALUE);

에게

Result := NOT (HFileRes = INVALID_HANDLE_VALUE);

나는 또한 'no n't (result) 그런 다음 시작'(및 '끝')을 제거하여 항상 핸들이나 후속 할당을 닫고 읽기 오류가 발생합니다.

나는 이제 이것을 이렇게 부릅니다

if filenotopen(filename) then 
  begin
    assignfile(f,filename);
    reset(f)
    etc;
  end
else
  message('file open by a different program')
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top