Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.05.2008, 17:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,024
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию 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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter