Q&A

  • 파일 복사(copy file) 문제입니다.
백업 디렉토리를 만들고 데이타를 전부 복사하는 루틴입니다.

파일을 하나씩 복사할 때는 문제가 엄는데, 한꺼번에 복사 하려니까,

중간에 멈추네여...ㅠ,ㅠ

고수님들의 조언 부탁 드립니다.



procedure TSalaryMainForm.BitBtn4Click(Sender: TObject);

var

sr: TSearchRec;

begin

dmSalary.Destroy;

CreateDir(DateToStr(Now));

if FindFirst('d:급여관리Data*.*', faAnyFile, sr) = 0 then

begin

while FindNext(sr) = 0 do

begin

if sr.Size > 0 then

begin

if not CopyFile(sr.Name,'d:급여관리'+DateToStr(Now)+''+sr.Name) then

break;

end;

end;

FindClose(sr);

end;

dmSalary := TdmSalary.Create(self);

end;



Function TSalaryMainForm.CopyFile(FromFile,ToFile:String): Boolean;

Var

FromF, ToF: file;

{$IFDEF WIN32}

NumRead, NumWritten: Integer;

{$ELSE}

NumRead, NumWritten: Word;

{$ENDIF}

Buf: array[1..2048] of Char;

Begin

AssignFile(FromF, FromFile);

AssignFile(ToF, ToFile);

Try

FileMode := 0; {Sets Reset To ReadOnly}

Reset(FromF, 1);{ Record size = 1 }

FileMode := 2; {Sets Reset To ReadWrite}

Rewrite(ToF, 1);{ Record size = 1 }

repeat

BlockRead(FromF, Buf, SizeOf(Buf), NumRead);

BlockWrite(ToF, Buf, NumRead, NumWritten);

until (NumRead = 0) or (NumWritten <> NumRead);

System.CloseFile(FromF);

System.CloseFile(ToF);

Result := True;

Except

On EInOutError Do

Begin

Result := False;

End;

Else Result := False;

End;

If Result = False Then

MessageDlg('다음 화일을 복사하는 중에 문제가 발생하였습니다 !! '+FromFile,

mtWarning, [mbOk], 0);

End;

4  COMMENTS
  • Profile
    홍성락 2001.09.20 03:09
    어피리 wrote:

    > 백업 디렉토리를 만들고 데이타를 전부 복사하는 루틴입니다.

    > 파일을 하나씩 복사할 때는 문제가 엄는데, 한꺼번에 복사 하려니까,

    > 중간에 멈추네여...ㅠ,ㅠ

    > 고수님들의 조언 부탁 드립니다.

    >

    > procedure TSalaryMainForm.BitBtn4Click(Sender: TObject);

    > var

    > sr: TSearchRec;

    > begin

    > dmSalary.Destroy;

    > CreateDir(DateToStr(Now));

    > if FindFirst('d:급여관리Data*.*', faAnyFile, sr) = 0 then

    > begin

    > while FindNext(sr) = 0 do

    > begin

    > if sr.Size > 0 then

    > begin

    > if not CopyFile(sr.Name,'d:급여관리'+DateToStr(Now)+''+sr.Name) then

    > break;

    > end;

    > end;

    > FindClose(sr);

    > end;

    > dmSalary := TdmSalary.Create(self);

    > end;

    >

    > Function TSalaryMainForm.CopyFile(FromFile,ToFile:String): Boolean;

    > Var

    > FromF, ToF: file;

    > {$IFDEF WIN32}

    > NumRead, NumWritten: Integer;

    > {$ELSE}

    > NumRead, NumWritten: Word;

    > {$ENDIF}

    > Buf: array[1..2048] of Char;

    > Begin

    > AssignFile(FromF, FromFile);

    > AssignFile(ToF, ToFile);

    > Try

    > FileMode := 0; {Sets Reset To ReadOnly}

    > Reset(FromF, 1);{ Record size = 1 }

    > FileMode := 2; {Sets Reset To ReadWrite}

    > Rewrite(ToF, 1);{ Record size = 1 }

    > repeat

    > BlockRead(FromF, Buf, SizeOf(Buf), NumRead);

    > BlockWrite(ToF, Buf, NumRead, NumWritten);

    > until (NumRead = 0) or (NumWritten <> NumRead);

    > System.CloseFile(FromF);

    > System.CloseFile(ToF);

    > Result := True;

    > Except

    > On EInOutError Do

    > Begin

    > Result := False;

    > End;

    > Else Result := False;

    > End;

    > If Result = False Then

    > MessageDlg('다음 화일을 복사하는 중에 문제가 발생하였습니다 !! '+FromFile,

    > mtWarning, [mbOk], 0);

    > End;

    /////////////////////////////////////////////////////////////

    단순 파일을 복사식 백업이라면

    CopyFile(PChar(file_name), PChar(file_name2), False);쓰면안되나요.

    또 폴더생성은 있는지 검사후에 한번만생성하면 될것 같은데요.

    if DirectoryExists(NEW_DIR)=False then

    ForceDirectories(NEW_DIR);



  • Profile
    어피리 2001.09.21 19:13
    홍성락 wrote:

    > 어피리 wrote:

    > > 백업 디렉토리를 만들고 데이타를 전부 복사하는 루틴입니다.

    > > 파일을 하나씩 복사할 때는 문제가 엄는데, 한꺼번에 복사 하려니까,

    > > 중간에 멈추네여...ㅠ,ㅠ

    > > 고수님들의 조언 부탁 드립니다.

    > >

    > > procedure TSalaryMainForm.BitBtn4Click(Sender: TObject);

    > > var

    > > sr: TSearchRec;

    > > begin

    > > dmSalary.Destroy;

    > > CreateDir(DateToStr(Now));

    > > if FindFirst('d:급여관리Data*.*', faAnyFile, sr) = 0 then

    > > begin

    > > while FindNext(sr) = 0 do

    > > begin

    > > if sr.Size > 0 then

    > > begin

    > > if not CopyFile(sr.Name,'d:급여관리'+DateToStr(Now)+''+sr.Name) then

    > > break;

    > > end;

    > > end;

    > > FindClose(sr);

    > > end;

    > > dmSalary := TdmSalary.Create(self);

    > > end;

    > >

    > > Function TSalaryMainForm.CopyFile(FromFile,ToFile:String): Boolean;

    > > Var

    > > FromF, ToF: file;

    > > {$IFDEF WIN32}

    > > NumRead, NumWritten: Integer;

    > > {$ELSE}

    > > NumRead, NumWritten: Word;

    > > {$ENDIF}

    > > Buf: array[1..2048] of Char;

    > > Begin

    > > AssignFile(FromF, FromFile);

    > > AssignFile(ToF, ToFile);

    > > Try

    > > FileMode := 0; {Sets Reset To ReadOnly}

    > > Reset(FromF, 1);{ Record size = 1 }

    > > FileMode := 2; {Sets Reset To ReadWrite}

    > > Rewrite(ToF, 1);{ Record size = 1 }

    > > repeat

    > > BlockRead(FromF, Buf, SizeOf(Buf), NumRead);

    > > BlockWrite(ToF, Buf, NumRead, NumWritten);

    > > until (NumRead = 0) or (NumWritten <> NumRead);

    > > System.CloseFile(FromF);

    > > System.CloseFile(ToF);

    > > Result := True;

    > > Except

    > > On EInOutError Do

    > > Begin

    > > Result := False;

    > > End;

    > > Else Result := False;

    > > End;

    > > If Result = False Then

    > > MessageDlg('다음 화일을 복사하는 중에 문제가 발생하였습니다 !! '+FromFile,

    > > mtWarning, [mbOk], 0);

    > > End;

    > /////////////////////////////////////////////////////////////

    > 단순 파일을 복사식 백업이라면

    > CopyFile(PChar(file_name), PChar(file_name2), False);쓰면안되나요.

    > 또 폴더생성은 있는지 검사후에 한번만생성하면 될것 같은데요.

    > if DirectoryExists(NEW_DIR)=False then

    > ForceDirectories(NEW_DIR);

    >



    CopyFile(PChar(file_name), PChar(file_name2), False);

    <=== 이런방식으로 코딩을 수정하였읍니다.

    그래도 똑같은 위치에서 복사가 정지 되거든여...ㅠ.ㅠ

    copyfile 문에 스트링 그리드 복사나 아님 DB에 기록 따위의

    코딩으로 대체하면 끝까지 바로 수행 되는데, 파일 카피만 하면

    5번째에서 멈추어 버립니다.

    루틴에 문제가 있는지여??? 델파이 도움말 예제 그대로 베낀건데 ㅠ.ㅠ

    한번만 도움을 주세여...



    procedure TSalaryMainForm.BitBtn4Click(Sender: TObject);

    > > var

    > > sr: TSearchRec;

    > > begin

    > > dmSalary.Destroy;

    > > CreateDir(DateToStr(Now));

    > > if FindFirst('d:급여관리Data*.*', faAnyFile, sr) = 0 then

    > > begin

    > > while FindNext(sr) = 0 do

    > > begin

    > > if sr.Size > 0 then

    > > begin

    > > if not CopyFile(PChar(sr.Name),PChar('d:급여관리'+DateToStr(Now)''+sr.Name)) then

    > > break;

    > > end;

    > > end;

    > > FindClose(sr);

    > > end;

    > > dmSalary := TdmSalary.Create(self);

    > > end;



  • Profile
    홍성락 2001.09.21 20:35
    어피리 wrote:

    > 홍성락 wrote:

    > > 어피리 wrote:

    > > > 백업 디렉토리를 만들고 데이타를 전부 복사하는 루틴입니다.

    > > > 파일을 하나씩 복사할 때는 문제가 엄는데, 한꺼번에 복사 하려니까,

    > > > 중간에 멈추네여...ㅠ,ㅠ

    > > > 고수님들의 조언 부탁 드립니다.

    > > >

    > > > procedure TSalaryMainForm.BitBtn4Click(Sender: TObject);

    > > > var

    > > > sr: TSearchRec;

    > > > begin

    > > > dmSalary.Destroy;

    > > > CreateDir(DateToStr(Now));

    > > > if FindFirst('d:급여관리Data*.*', faAnyFile, sr) = 0 then

    > > > begin

    > > > while FindNext(sr) = 0 do

    > > > begin

    > > > if sr.Size > 0 then

    > > > begin

    > > > if not CopyFile(sr.Name,'d:급여관리'+DateToStr(Now)+''+sr.Name) then

    > > > break;

    > > > end;

    > > > end;

    > > > FindClose(sr);

    > > > end;

    > > > dmSalary := TdmSalary.Create(self);

    > > > end;

    > > >

    > > > Function TSalaryMainForm.CopyFile(FromFile,ToFile:String): Boolean;

    > > > Var

    > > > FromF, ToF: file;

    > > > {$IFDEF WIN32}

    > > > NumRead, NumWritten: Integer;

    > > > {$ELSE}

    > > > NumRead, NumWritten: Word;

    > > > {$ENDIF}

    > > > Buf: array[1..2048] of Char;

    > > > Begin

    > > > AssignFile(FromF, FromFile);

    > > > AssignFile(ToF, ToFile);

    > > > Try

    > > > FileMode := 0; {Sets Reset To ReadOnly}

    > > > Reset(FromF, 1);{ Record size = 1 }

    > > > FileMode := 2; {Sets Reset To ReadWrite}

    > > > Rewrite(ToF, 1);{ Record size = 1 }

    > > > repeat

    > > > BlockRead(FromF, Buf, SizeOf(Buf), NumRead);

    > > > BlockWrite(ToF, Buf, NumRead, NumWritten);

    > > > until (NumRead = 0) or (NumWritten <> NumRead);

    > > > System.CloseFile(FromF);

    > > > System.CloseFile(ToF);

    > > > Result := True;

    > > > Except

    > > > On EInOutError Do

    > > > Begin

    > > > Result := False;

    > > > End;

    > > > Else Result := False;

    > > > End;

    > > > If Result = False Then

    > > > MessageDlg('다음 화일을 복사하는 중에 문제가 발생하였습니다 !! '+FromFile,

    > > > mtWarning, [mbOk], 0);

    > > > End;

    > > /////////////////////////////////////////////////////////////

    > > 단순 파일을 복사식 백업이라면

    > > CopyFile(PChar(file_name), PChar(file_name2), False);쓰면안되나요.

    > > 또 폴더생성은 있는지 검사후에 한번만생성하면 될것 같은데요.

    > > if DirectoryExists(NEW_DIR)=False then

    > > ForceDirectories(NEW_DIR);

    > >

    >

    > CopyFile(PChar(file_name), PChar(file_name2), False);

    > <=== 이런방식으로 코딩을 수정하였읍니다.

    > 그래도 똑같은 위치에서 복사가 정지 되거든여...ㅠ.ㅠ

    > copyfile 문에 스트링 그리드 복사나 아님 DB에 기록 따위의

    > 코딩으로 대체하면 끝까지 바로 수행 되는데, 파일 카피만 하면

    > 5번째에서 멈추어 버립니다.

    > 루틴에 문제가 있는지여??? 델파이 도움말 예제 그대로 베낀건데 ㅠ.ㅠ

    > 한번만 도움을 주세여...

    >

    > procedure TSalaryMainForm.BitBtn4Click(Sender: TObject);

    > > > var

    > > > sr: TSearchRec;

    > > > begin

    > > > dmSalary.Destroy;

    > > > CreateDir(DateToStr(Now));

    > > > if FindFirst('d:급여관리Data*.*', faAnyFile, sr) = 0 then

    > > > begin

    > > > while FindNext(sr) = 0 do

    > > > begin

    > > > if sr.Size > 0 then

    > > > begin

    > > > if not CopyFile(PChar(sr.Name),PChar('d:급여관리'+DateToStr(Now)''+sr.Name)) then

    > > > break;

    > > > end;

    > > > end;

    > > > FindClose(sr);

    > > > end;

    > > > dmSalary := TdmSalary.Create(self);

    > > > end;

    /////////////////////////////////////////////////////////////////////////////

    제가말씀드린건 단순파일카피라는것으로요 CopyFile함수가 사용자정의 함수가 아닌

    내장함수사용을 이야기한겁니다,

    또한, CopyFile함수 인자중 대상파일명(sr.Name)은 디렉토리명도 써주어야하구요...

    아래 예제를 참조해보세요.

    procedure TForm1.Button1Click(Sender: TObject);

    var

    sr: TSearchRec;

    OLD_DIR, NEW_DIR : string;

    begin

    //dmSalary.Destroy;

    //CreateDir(DateToStr(Now));

    OLD_DIR := 'D:3D지반해석';

    NEW_DIR := 'D:3D지반해석'+DateToStr(Now);



    if DirectoryExists(OLD_DIR) then begin

    if DirectoryExists(NEW_DIR)=False then //유닛에 Filectrl 선언

    ForceDirectories(NEW_DIR);



    if FindFirst(OLD_DIR + '*.*', faAnyFile, sr) = 0 then begin

    repeat

    if sr.Size > 0 then begin

    CopyFile(PChar(OLD_DIR + '' + sr.Name),PChar(NEW_DIR + '' + sr.Name), False);

    end;

    until FindNext(sr) <> 0;

    end;

    FindClose(sr);

    end;

    //dmSalary := TdmSalary.Create(self);

    end;



  • Profile
    어피리 2001.09.22 00:56
    성공 했음다...^^