Структуре
TSHFileOpStruct в качестве параметра
pFrom можно передать просто список файлов без экзешника (в виде PString т.е. имена идут через #0, в конце ещё + #0), тогда и исключений не будет
Код:
type
TBuffer = array of Char;
procedure CreateBuffer(Names: TStrings; var P: TBuffer);
var
i, j, l : integer;
begin
for i := 0 to Names.Count-1 do
begin
l:= Length(P);
SetLength(P, L+Length(Names[i])+1);
for j := 0 to Length(Names[i])-1 do P[l+j]:= Names[i][j+1];
P[l + j]:= #0;
end;
SetLength(P, Length(P)+1);
P[Length(P)]:= #0;
end;
function MoveDir(const fromDir, toDir: string): Boolean;
var
sr: TSearchRec;
fos: TSHFileOpStruct;
fl: TStrings;
Buf: TBuffer;
begin
fl:= TStringList.Create;
if FindFirst(fromDir + '*.*', faAnyFile, sr) = 0 then
repeat
if (sr.Name = '.') or (sr.name = '..') then Continue;
if (sr.Attr and faDirectory) <> 0 then MoveDir(fromDir + sr.Name, toDir)
else
if sr.Name <> ExtractFileName(ParamStr(0)) then fl.Add(fromDir + sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
CreateBuffer(fl, Buf);
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_MOVE;
fFlags := FOF_FILESONLY or FOF_NOCONFIRMMKDIR;
pFrom := Pointer(Buf);
pTo := PChar(toDir)
end;
Result:= (0 = ShFileOperation(fos));
Buf:= nil;
fl.Free;
end;
использование
Код:
if MoveDir(ExtractFileDir(ParamStr(0)) + '\', 'C:\TMP') then Caption:= 'Done';
немного страшновато выглядит, нету времени чтоб собрать что-то более элегантное, посему это то что в DRKB было. Проверил, работает