전에 누군가 올려놓았던 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; //함수의 끝
참고 하세요..
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;