델파이고수분들께 질문이 있어 이렇게 글을 남깁니다.
아래 소스는 특정 폴더 있는 파일을 해당 폴더에 옮기는 과정의 소스입니다.
( 업데이트를 하기 위한 목적입니다. )
EX )
1. C:\TEST\DOWN 폴더 => TEST.EXE ( 최신버전 )
2. C:\TEST 폴더 => TEST.EXE(현재 사용하고 있는버전) / TEST_BACKUP.EXE (현재 사용하고 있는 바로 이전버전 )
3. 아래소스를 실행하면 먼저 DOWN폴더에 해당 파일이 있는지를 체크후
4. 있으면 현재 프로그램을 종료후 TEST_BACKUP.EXE 파일을 지운후
5. 기존의 TEST.EXE 파일을 -> TEST_BACKUP.EXE 으로 이름을 바꾼후
6. DOWN 폴더의 TEST.EXE를 해당 TEST폴더로 이동합니다.
이구조인데 윈도우 XP 나 윈도우 7 환경에서는 별탈없이 잘 동작하나
비스타 환경에서 문제가 생깁니다.
문제가 생기는것이 TimeWriteLogFile 이건 걸리는 시간을 찍은 함수인데 ..
첫번째 경우처럼 별문제없이 잘되는경우도 있는데
[11:37:14:211][프로그램종료후][001]
[11:37:14:211][백업파일삭제][002]
[11:37:14:242][백업파일만들기][003]
[11:37:16:473][다운받은걸복사][004]
[11:37:19:905][완료후][005]
[11:37:20:919][다운받은거삭제][006]
[11:37:21:808][프로그램실행][007]
두번째 경우처럼 2번에서 3번 넘어갈때 4분에서 5분이 소요됩니다.
[11:38:28:301][프로그램종료후][001]
[11:38:28:301][백업파일삭제][002]
[11:43:11:176][백업파일만들기][003]
[11:43:11:192][다운받은걸복사][004]
[11:43:14:265][완료후][005]
[11:43:15:279][다운받은거삭제][006]
[11:43:16:199][프로그램실행][007]
RenameFile 을 없애고 DeleteFile 시켜봐도 결과는 똑같고
3번 부분을 없애봐도 4번부분이 진행되는데 4분에서 5분이 소요됩니다
어떤방법을 동원해도 결과가 안나옵니다.
혹시 해결책을 아시는분이 계시다면 답변부탁드리겠습니다.
------------------------------------------------------------------------------
procedure TForm.Timer_UpdaterTimer(Sender: TObject);
var
SourceFile,TargetFile : TFileStream;
Soo : DWORD;
Hnd : THandle;
strPath:String;
begin
Timer_Updater.Enabled := False;
strPath := ExtractFilePath(Application.ExeName);
if FileExists(strPath + 'Down\TEST.exe') then
begin
try
Hnd := FindWindow(nil, 'TEST');
GetWindowThreadProcessID( Hnd, @Soo );
TerminateProcess( OpenProcess( PROCESS_TERMINATE, BOOL(0), Soo ), 0 );
Sleep(1000);
TimeWriteLogFile('프로그램종료후', '001');
while FileExists(strPath + 'TEST_Backup.exe') do
DeleteFile(strPath + 'TEST_Backup.exe');
TimeWriteLogFile('백업파일삭제', '002');
RenameFile(strPath +'TEST.exe', strPath + 'TEST_Backup.exe');
Application.ProcessMessages;
TimeWriteLogFile('백업파일만들기', '003');
SourceFile := TFileStream.Create(strPath + 'Down\TEST.exe', fmOpenRead );
TargetFile := TFileStream.Create(strPath + 'TEST.exe', fmOpenWrite or fmCreate );
TimeWriteLogFile('다운받은걸복사', '004');
TargetFile.CopyFrom(SourceFile, SourceFile.Size ) ;
SourceFile.Free;
TargetFile.Free;
TimeWriteLogFile('완료후', '005');
Sleep(1000);
while FileExists(strPath + 'Down\TEST.exe') do
DeleteFile(strPath + 'Down\TEST.exe');
TimeWriteLogFile('다운받은거삭제', '006');
if ParamCount = 0 then
ShellExecute(Handle, 'open', 'TEST.exe', 'Updater', PChar(strPath), SW_NORMAL)
else
ShellExecute(Handle, 'open', 'TEST.exe', PChar('Updater' + ' ' + ParamStr(1) + ' ' + ParamStr(2) + ' ' + ParamStr(3) + ' ' + ParamStr(4) + ' ' + ParamStr(5) + ' ' + ParamStr(6)), PChar(strPath), SW_NORMAL);
TimeWriteLogFile('프로그램실행', '007');
Sleep(500);
Application.ProcessMessages;
Application.Terminate;
except
end;
end;
end;
-------------------------------------------------------------------------------------------
|