|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
SHFileOperation. Блокировка файлов
Всем привет.
Первый раз разбирался с сабжем. В общем, работает, но наблюдается любопытный эффект - только что обработанные файлы блокируются. От чего зависит пока не разобрался, может кто так знает? Вот код. Код:
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; |