문제
델파이에서 다시 쓰기로 파일이 열렸는지 확인하는 방법이 있습니까?
코드는 다음과 같이 진행됩니다.
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')
제휴하지 않습니다 StackOverflow