Всем привет.
Первый раз разбирался с сабжем.
В общем, работает, но наблюдается любопытный эффект - только что обработанные файлы блокируются. От чего зависит пока не разобрался, может кто так знает?
Вот код.
Код:
procedure TBrowserMainForm.DoFileOp(AOp: DWORD; ADest : String);
var
I : Integer;
AFiles : TStringList;
AItem: TEasyItem;
ASize : LongInt;
AFrom : PChar;
ABuffer : PChar;
AOpData : TSHFileOpStruct;
begin
AFrom := Nil;
ASize := 0;
AFiles := TStringList.Create;
Try
AItem := lvImages.Selection.First;
While Assigned(AItem) Do
Begin
If AItem.Data <> Nil Then
Begin
AFiles.Add((AItem.Data As TImageItemData).FileName);
ASize := ASize + Length((AItem.Data As TImageItemData).FileName) + 1;
End;
AItem := lvImages.Selection.Next(AItem);
End;
GetMem(AFrom,ASize+1);
ABuffer := AFrom;
For I := 0 To AFiles.Count-1 Do
ABuffer := StrECopy(ABuffer,PChar(AFiles[i])) + 1;
FillChar(AOpData, SizeOf(AOpData), #0);
AOpData.Wnd := Handle;
AOpData.wFunc := AOp;
AOpData.fAnyOperationsAborted := False;
AOpData.hNameMappings := Nil;
AOpData.lpszProgressTitle := Nil;
AOpData.pFrom := AFrom;
If (AOp = FO_COPY) Or (AOp = FO_MOVE)
Then AOpData.pTo := PChar(ADest)
Else AOpData.pTo := Nil;
AOpData.fFlags := FOF_NOCONFIRMMKDIR;
If SHFileOperation(AOpData) = 0 Then
Begin
Screen.Cursor := crHourGlass;
Try
Case AOp Of
FO_DELETE :
Begin
For I := 0 To AFiles.Count-1 Do
If Not FileExists(AFiles[i])
Then DeleteDescription(AFiles[i]);
End;
FO_COPY :
Begin
For I := 0 To AFiles.Count-1 Do
CopyDescription(AFiles[i], IncludeTrailingPathDelimiter(ADest) + ExtractFilename(Afiles[i]));
End;
FO_MOVE :
Begin
For I := 0 To AFiles.Count-1 Do
MoveDescription(AFiles[i], IncludeTrailingPathDelimiter(ADest) + ExtractFilename(Afiles[i]));
End;
End;
Finally
Screen.Cursor := crDefault;
End;
End;
Finally
AFiles.Free;
If AFrom <> Nil Then FreeMem(AFrom,ASize);
End;
end;