파일을 읽기 위해서 아래와 같은 coding을 하였습니다.
---------------------------------------------------------------------------
while NOT(FileExists(TEMP_DIR+LOGIN_CHK_FILE)) do begin
sleep(1000);
roofCnt := roofCnt + 1;
if roofCnt > 10 then begin
ShowMessage('Login Check File Open Failed. retry Please!');
break;
end;
end;
sleep(1000);
if FileExists(TEMP_DIR+LOGIN_CHK_FILE) then begin
AssignFile(ChkFile, TEMP_DIR+LOGIN_CHK_FILE);
Reset(ChkFile);
ReadLn(ChkFile, sBuf);
...
----------------------------------------------------------------------------
위의 code 이전에는, 아래와 같은 coding을 통하여 위에서 읽으려고 시도하는 파일을
작성하고 있습니다.
------------------------------------------------------------------------------
WinExec(PChar('cmd /c ' + command +' >> ' + TEMP_DIR+LOGIN_CHK_FILE + '; exit;') ,SW_HIDE);
------------------------------------------------------------------------------
그런데 문제는, 저렇게 WinExec를 이용해서 파일을 생성할 때, 실제 디렉토리에 파일이
생성 된 것이 보이지 않아도,
제가 윗부분에서 coding한 'while NOT(FileExists(TEMP_DIR+LOGIN_CHK_FILE)) do begin'
이 부분을 통과 한다는 겁니다.
일단 꽁수로, 'sleep(1000)'을 줘서 시간을 끌어보았지만, 시스템 상태에 따라서
어떤 때에는, 정상처리 되고, 어떤 때에는 'I/O Error 103'을 출력하고 있네요..
그래서, 질문 드립니다.
위와 같이, 파일을 생성할 때, 해당 파일이 완전히 생성되었는지의 여부를 파악할 수
있습니까? 파일이 완전히 생성되지 않았는데도 불구하고, FileExists가 True를 반환
하는 경우를 겪어보신 분들의 소중한 조언 부탁드립니다.
다른질문,
CloseFile(TextFile); <-- 해당 명령을 실행 하기 이전에, TextFile이 Assign 되었는지
를 확인하는 명령이나 방법이 있습니까?
이곳 저곳 레퍼런스를 찾아보고는 있지만, 능력이 부족해서 원하는 답을 못 찾았네요.
우매한 후학을 위해서 조언 좀 부탁드리겠습니다.
탐색기는 몇가지 훅을 거쳐서 생성된 파일을 디스플레이하기 때문에 파일이 생성되고 약간의 딜레이 후에 파일목록에 표시가 됩니다. 때문에 생성된 파일이 화면상에 보이지 않아도 이미 파일은 만들어져 있습니다. FileExists는 파일이 탐색기의 화면에 표시된것과는 무관하게 순수하게 디스크에 파일이 만들어져 있는가를 판단합니다.
프로그램 내에서 파일을 만드는게 아니라 WinExec를 이용해서 외부 프로그램을 통해서 만드시는데 WinExec는 프로그램을 실행하고 종료될때까지 기다리는게 아니라 실행만 하고 바로 리턴합니다. 때문에 외부프로그램에서 파일을 만드는 시간과 FileExists로 검사하는 시간사이에 싱크가 안맞을 수가 있습니다. 어떨땐 에러가 발생하고 어떨땐 정상적으로 처리된다는게 이것때문이죠...
자유게시판이나 질답란에서 검색하시면 CreateProcess나 ShellExecuteEx를 이용해서 외부프로그램의 실행을 종료할때까지 기다리도록해주는 팁이 있습니다. 이 팁을 이용해서 외부프로그램이 종료된후에 FileExists로 검사를 하도록 코딩하시면 문제없을겁니다.
마지막 질문은 그냥 예외처리하시거나 $I 지시자를 사용하심이... 이러면 굳이 assign되어 있는가를 판단하지 않아도 됩니다.
^^ 항상 즐코하세요...