Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[13595] 비스타에서 파일옮길시에 문제점관련 긴급문의...
궁금환자 [] 1585 읽음    2011-02-11 16:01
델파이고수분들께 질문이 있어 이렇게 글을 남깁니다.

아래 소스는 특정 폴더 있는 파일을 해당 폴더에 옮기는 과정의 소스입니다.
( 업데이트를 하기 위한 목적입니다. )

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;

-------------------------------------------------------------------------------------------

+ -

관련 글 리스트
13595 비스타에서 파일옮길시에 문제점관련 긴급문의... 궁금환자 1585 2011/02/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.