Q&A

  • 폴더를 복사해서 그 폴더를 압축하려 하는데 이상한 일이 발생합니다.
안녕하세요. 지금 몇개의 폴더를 하나의 폴더로 복사해온 후에 그 폴더를 압축하는 프로그램을 짜고 있습니다. 물론 이게 끝이 아니고 이 압축된 파일을 클라이언트쪽으로 보내야 하는데 자꾸 에러가 나타나 도대체 무엇이 문제일까를 알아내려 하나하나 단계를 밟아가며 해볼려고 하다가 이상한 난관에 부딪치게 되었습니다.
우선 아래 소스를 보시면

procedure TForm1.Button1Click(Sender: TObject);
var
  sGraphic, sSound, sNetWork, sMainBoard : String;
  cGraphic, cSound, cNetWork, cMainBoard : String;

begin
  Button1.Enabled := False;
  listBox1.Items.Add('ini File의 정보를 취합하기 시작합니다.');
  orderini := TiniFile.Create('C:\\Result\12345678\12345678.ini');

  listBox1.Items.Add('복사할 파일의 정보를 취합하기 시작합니다.');
  sGraphic := orderini.ReadString('Device Name', 'Graphic Card', '');
  sSound := orderini.ReadString('Device Name', 'Sound Card', '');
  sNetWork := orderini.ReadString('Device Name', 'NetWork Card', '');
  sMainBoard := orderini.ReadString('Device Name', 'MainBoard', '');

  listbox1.Items.Add('정보를 확인합니다.');
  listbox1.Items.Add('Graphic Card = ' + sGraphic);
  listbox1.Items.Add('Sound Card = ' + sSound);
  listbox1.Items.Add('NetWork Card = ' + sNetWork);
  listbox1.Items.Add('MainBoard Card = ' + sMainBoard);


  listBox1.Items.Add('복사할 디렉토리에 관한 정보를 취합하기 시작합니다.');
  cGraphic := orderini.ReadString('Copy Folder Path', sGraphic, '');
  cSound := orderini.ReadString('Copy Folder Path', sSound, '');
  cNetWork := orderini.ReadString('Copy Folder Path', sNetwork, '');
  cMainBoard := orderini.ReadString('Copy Folder Path', sMainBoard, '');

  listBox1.Items.Add('모든 정보의 취합 작업을 마칩니다.');
  listBox1.Items.Add(cGraphic + ' 의 복사를 시작합니다.');
  CopyFolder(cGraphic);
  listBox1.Items.Add(cGraphic + ' 의 복사를 완료하였습니다.');
  listBox1.Items.Add(cSound + ' 의 복사를 시작합니다.');
  CopyFolder(cSound);
  listBox1.Items.Add(cSound + ' 의 복사를 완료하였습니다.');
  listBox1.Items.Add(cNetwork + ' 의 복사를 시작합니다.');
  CopyFolder(cNetwork);
  listBox1.Items.Add(cNetWork + ' 의 복사를 완료하였습니다.');
  listBox1.Items.Add(cMainBoard + ' 의 복사를 시작합니다.');
  CopyFolder(cMainBoard);
  listBox1.Items.Add(cMainBoard + ' 의 복사를 완료하였습니다.');
  orderini.Free;
  ShowMessage('모든 폴더의 복사를 완료하였습니다.');
//  listBox1.Items.Add('폴더의 압축을 시작합니다.');
//  FolderCompress;
//  ShowMessage('모든 폴더의 압축을 완료하였습니다.');
  Button1.Enabled := True;
end;

procedure Tform1.CopyFolder(s1: String);
var
  F : TShFileOpStruct;
  CopyPath : String;

begin
  CopyPath := 'C:\\Result\';
  F.Wnd := Handle; // if 0, then no parent and can task switch away
  F.wFunc := FO_COPY;
  F.pFrom := PChar(s1);
  F.pTo := PChar(CopyPath);
  F.fFlags := FOF_ALLOWUNDO or FOF_RENAMEONCOLLISION;
  if ShFileOperation(F) <> 0 then ShowMessage('Copy Failed')
  else listbox1.Items.Add(s1 + ' 복사를 성공하였습니다.');
end;

{procedure Tform1.FolderCompress;
var
  iZipName, iDataDirPath, iCompressDirPath, ZipFilePath : string;

begin
  ZipFilePath := 'C:\\Result\ZipFileFolder\';
  if Not DirectoryExists(ZipFilePath) then ForceDirectories(ZipFilePath);
  iZipName := 'Driver.zip';
  iDataDirPath := 'C:\\Result\';
  iCompressDirPath := ZipFilePath + iZipName;
  ZIP.ArchiveFile := iCompressDirPath;
  ZIP.FileSpec.Clear;
  ZIP.FileSpec.Add(iDataDirPath);
  ZIP.Compress;
end;}

보시는 바처럼 압축에 관한 함수를 주석처리하고 실행으로 시키면 ini File을 읽어와서 처음부터 제대로 폴더를 복사해가지고 옵니다. 하지만 이것을 주석처리를 해제하고 실행하면 처음에 (CopyFolder(cGraphic);--> 제일 처음으로 복사를 시작하는 부분입니다.) 경로를 찾을 수 없어서 폴더를 복사할 수 없다는 메세지가 나오고 그 다음부터는 복사가 잘됩니다.
문제를 찾아내려해도 도저히 제 실력으로는 안되네요.
고수님들 이게 무슨 문제일까요? 지적 기다리고 있겠습니다.
귀찮으시더라도 좀 부탁 좀 드리겠습니다.
그럼 수고하세요.


p.s : 전 지금 델파이 7에서 프로그램을 하고 있고, 윈도우는 xp home edition입니다.
      그리고 압축 컴포넌트는 ZipTV를 썼구요.
      소스도 같이 첨부합니다.
0  COMMENTS