Показать сообщение отдельно
  #6  
Старый 11.04.2014, 17:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Структуре 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 было. Проверил, работает
Ответить с цитированием