Q&A

  • CopyFile 함수에 대한 맹점을 문의합니다.
전에 누군가 올려놓았던 DirectoryCopy(Sourcedir :string; Destdir: string);을 사용하여 디렉토리에 있는 모든 화일을 원하는 디렉토리로 모두 복사를 시도하였읍니다.



그러나 이상하게도 모든 화일이 복사되지는 않았습니다.

여러 시간 허비끝에 CopyFile() API함수는 '읽기' 속성만 있는 디렉토리내의 화일들은 복사가 되지 않는 것을 알았습니다.

제가 궁금한 것은 원래의 속성을 그대로 복사할 수 있는 방법이 없는가 입니다.

'ReadOnly' 속성인 디렉토리를 복사하지 못하는 CopyFile은 별로 의미가 없어 보입니다.



전문가님들의 많은 조언을 부탁드립니다.



[참고]

아래에 DirectoryCopy(Sourcedir :string; Destdir: string);에 대한 소스를 함께 올립니다.



Procedure TForm1.DirectoryCopy(Sourcedir :string; Destdir: string);

var Pstr : array[0..256] of char; //널 종료 문자열로 바꾸기 위한 저정하기 위한 변수

Pstr2 : array[0..256] of char;

str : string[255]; //경로를 조립하기 위한 임시 문자열

str2 : string[255];

SearchRec : TsearchRec; //소스디렉토리를 검색하고자 할때 쓰이는 레코드(파스칼 구조체입니다.);

Result : integer; //찾았는지 못 찾았는지 여부

BEGIN

str := Sourcedir + '*.*';

findfirst(str, faanyfile, SearchRec); //소스폴더를 검색한다.

Result := 0; //검색결과 여부의 초기화



While Result = 0 do //다음 화일을 찾아 루프를 반복

begin

if (SearchRec.name = '.') or (SearchRec.name = '..') then

begin //폴더가 자기자신이거나 상위폴더일 경우

Result := findnext(SearchRec); //검색 결과 화일을 찾으면 1이다.)

continue;

end;



if SearchRec.attr = fadirectory then //발견한 대상이 디렉토리이면

begin

str := Sourcedir + '' + SearchRec.name; //소스디렉토리 와 발견한 디렉토리를 더한다.

str2 := Destdir + '' + SearchRec.name; //타켓디렉토리 와 발견한 디렉토리를 더해준다.

Mkdir(str2); //타켓디렉토리를 생성한다.

DirectoryCopy(str, str2); //디렉토리 이므로 여기서 자기자신을 재귀호출한다.

Result := findnext(SearchRec); //결과를 돌려준다.

continue;

end;



//아래는 찾은것이 화일일 경우 복사를 하는 부분이다.

//완전 경로명으로 조립해 주어야 한다.

str := Sourcedir + '' + SearchRec.name;

str2 := Destdir + '' + SearchRec.name;

StrPcopy(pstr, str);

StrPcopy(pstr2, str2);

CopyFile(pstr, pstr2, false);

//이것은 API함수이다. Parameter는

//CopyFile(소스화일명, 데스트화일명, 플래그) 마지막 인자인 플래그는 false 일경우 화일이 존재할때 덮어쓴다.)

Result := findnext(SearchRec); //검색여부

end; //While 문의 끝

END; //함수의 끝





2  COMMENTS
  • Profile
    김민식 2001.04.02 02:09
    자세한 내용은 시간관계상 생략하고 제가 구현한 소스입니다.

    참고 하세요..



    procedure TForm1.pSave_Tab2_3;

    var

    i, j ,strLength, tmpPos, test : integer;

    OldString, NewString, dirPos, lstPos, TempString, PathString, BeforeString, OldTempString : String;

    TempDir : String;

    f : File;

    begin

    for i := 0 to ListBox2.Items.Count-1 do

    begin

    OldString := ListBox2.Items[i];



    Memo3.Lines.Add('****************************************************************');

    TempString := OldString;

    PathString := '';



    test := 1;



    while test <> 0 do

    begin

    test := Pos('', TempString);

    OldTempString := TempString;



    TempString := Copy(TempString, test+1, length(TempString));

    BeforeString := Copy(OldTempString, 1, test-1);

    PathString := PathString + '' + BeforeString;

    end;



    PathString := Copy(PathString, 2, Length(PathString)-1);

    NewString := StringReplace(TempString,' ','',[rfReplaceAll]); //FileName의 공백제거



    Memo3.Lines.Add('원본파일 : ' + PathString + TempString);



    tmpPos := Pos('', PathString);

    dirPos := Copy(PathString, 1, tmpPos-1);



    strLength := Length(PathString);

    lstPos := Copy(PathString, tmpPos+1, strLength);



    TempDir := dirPos + '' + lstPos;



    CreateDirectory(TempDir);



    if FileExists(dirPos + 'new_' + lstPos + NewString) = false then

    begin

    CopyFile(ListBox2.Items[i], dirPos + 'new_' + lstPos + TempString);

    AssignFile(f, dirPos + 'new_' + lstPos + TempString);

    Rename(f, dirPos + 'new_' + lstPos + NewString);

    end;

    end;



    Memo3.Lines.Add('');



    CheckBox3.Checked := false;

    end;





    Function TForm1.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

    If IsDir(FromFile) Then

    Begin

    {MessageDlg('Problem! There Was A Problem Copying '+FromFile,

    mtWarning, [mbOk], 0);}

    Result := False;

    End

    Else

    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('Problem! There Was A Problem Copying '+FromFile,

    mtWarning, [mbOk], 0);

    End;

    End;



    Function TForm1.IsDir(IsDirPath: String): Boolean;

    Var

    FileGetAttrValue: Integer;

    Begin

    {$IFDEF WIN32}

    Result := DirectoryExists(IsDirPath);

    Exit;

    {$ENDIF}

    FileGetAttrValue := FileGetAttr(IsDirPath);

    If FileGetAttrValue = 16 Then

    Begin

    Result := True

    End

    Else

    Begin

    Result := False

    End;

    End;





  • Profile
    컴맹 2001.03.30 09:06
    Shellcopy를 한번 사용해보세여..



    정확한 함수명은 아마두.. ShFileOperation일거에여..



    자세한 자료는 여기 팁란에 있습니다..

    이함수를 사용하면 파일 복사 삭제,모두 하실수 있습니다..



    그럼 이만...!