Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SHFileOpStruct не перемещает на флешке в NTFS, SHFileOpStruct не перемещает файлы  
V
    Опции темы
Jaroslav285
Дата 20.3.2015, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.1.2015
Где: Черкассы, Украина

Репутация: нет
Всего: нет



Здравствуйте, столкнулся со следующей проблемой, программа должна перемещать файлы папки на флешке в папку Backup.
Когда флешка в файловой системе FAT32 все работает правильно, а если флешка в файловой системе NTFS, то файлы перемещаются без проблем, а папки названия которых в кириллице или в верхнем регистре английской раскладки не перемещаются никак, перечитал много статей на тему shfileopstruct, но по своей проблеме вразумительного ответа так и не нашел, поэтому прошу Вас помочь разобраться в данной проблеме, свой код добавляю ниже.

Код


procedure TForm1.WMDeviceChange(var Msg: TMessage);
var pDBT:P_DEV_BROADCAST_HDR;
  FileOp: TSHFileOpStruct;

   vVolumeName, vFileSystemName: array [0..MAX_PATH-1] of Char;
  vVolumeSerialNo, vMaxLength, vFileSystemFlags: LongWord;
             const
begin

case Msg.WParam of
        $8000:
         begin
         Memo1.Lines.Clear;
            for s:= 'D' to 'J' do begin
      if (GetDriveType(PChar(s+':\'))  = DRIVE_REMOVABLE)
        then begin memo1.Lines.Add(s+':\');  //Получение списка вставленных флешек при подключении USB-Flash

        pDBT := Pointer(Msg.LParam);
        if pDBT<>nil then
        if (pDBT^.dbch_devicetype=$00000002) then begin //проверка на тип устройства если флешка то


       try

if  not DirectoryExists(s+':'+'\Backup')  then      begin    // Сама структура с которой проблемы

  ZeroMemory(@FileOp, SizeOf(TSHFileOpStruct));
  FileOp.Wnd:=Handle;
  FileOp.wFunc:=FO_MOVE;// FO_MOVE FO_COPY FO_DELETE FO_RENAME
FileOp.pFrom:=PChar(s+':\'+'*.*'+#0)   ;
FileOp.pTo:=PChar(s+':\'+'Backup'+#0);
FileOp.fFlags:=0+FOF_NOCONFIRMMKDIR;
FileOp.fFlags:=FOF_NOERRORUI or FOF_NOCONFIRMATION or fof_silent;
FileOp.hNameMappings :=0;
SHFileOperationW(FileOp);
 end ;  except

       end;
        end;
        end;
        end;
        end;
        $8004:
        end;
end;




Жду Ваших ответов, буду рад любой помощи, заранее спасибо.
PM MAIL WWW ICQ Skype GTalk   Вверх
Illusion Dolphin
Дата 20.3.2015, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 4
Всего: 63



А делфи какой? Старинный неюникодный? А зачем вообще SHFileOperationW? Стримами не подходит вариант? 

P.S.
Код

 end ;  except
       end;
        end;
        end;
        end;
        end;
        $8004:
        end;
end;

О да, это на govnokod.ru


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Jaroslav285
Дата 20.3.2015, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.1.2015
Где: Черкассы, Украина

Репутация: нет
Всего: нет



SHFileOperationW - это от безысходности, XE5 сама по себе использует WChar, уже поправил на SHFileOperation, за критику спасибо, буду исправляться, использую Delphi RAD Studio XE5, эта функция (ShFileOpStruct) больше подходит под мои цели, так как она не показывает диалоги и может забрать файлы и папки пакетом. Вот никак не получается NTFS побороть...

Это сообщение отредактировал(а) Jaroslav285 - 20.3.2015, 14:32
PM MAIL WWW ICQ Skype GTalk   Вверх
Jaroslav285
Дата 20.3.2015, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.1.2015
Где: Черкассы, Украина

Репутация: нет
Всего: нет



Цитата

А делфи какой? Старинный неюникодный? А зачем вообще SHFileOperationW? Стримами не подходит вариант? 


Цитата

SHFileOperationW - это от безысходности, XE5 сама по себе использует WChar, уже поправил на SHFileOperation, за критику спасибо, буду исправляться, использую Delphi RAD Studio XE5, эта функция (ShFileOpStruct) больше подходит под мои цели, так как она не показывает диалоги и может забрать файлы и папки пакетом. Вот никак не получается NTFS побороть...



Привел к SHFileOperationА, хорошего из этого ничего не вышло, не только не переместило ничего, а даже папку для перемещения не создает ни в той ни в той ФС.

Изменение

Код

 FileOp.pFrom:=PChar(s+':\'+'*.*'+#0)   ;


на 

Код

FileOp.pFrom:=PChar(s+':\'+'*'+#0)   ;


Чуть ускорило процесс перемещения в FAT32, но проблему в NTFS так и не решило.
PM MAIL WWW ICQ Skype GTalk   Вверх
Illusion Dolphin
Дата 21.3.2015, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 4
Всего: 63



Цитата

а папки названия которых в кириллице или в верхнем регистре английской раскладки не перемещаются никак

А что происходит если не перемещается? Какой код ошибки возвращается? 

Вот попробуйте такой вариант, у меня он работает:

Код


procedure CreateBuffer(Files: TStrings; var P: TCharBuffer);
var
  I: Integer;
  S: string;
begin
  for I := 0 to Files.Count - 1 do
  begin
    if S = '' then
      S := Files[I]
    else
      S := S + #0 + Files[I];
  end;
  S := S + #0#0;
  SetLength(P, Length(S));
  for I := 1 to Length(S) do
    P[I - 1] := S[I];
end;

function CopyFilesSynch(Handle: Hwnd; Src: TStrings; Dest: string; Move: Boolean; AutoRename: Boolean): Integer;
const
  DE_SAMEFILE = $71;
var
  SHFileOpStruct: TSHFileOpStruct;
  SrcBuf: TCharBuffer;
begin
  CreateBuffer(Src, SrcBuf);
  with SHFileOpStruct do
  begin
    Wnd := Handle;
    if Move then
      WFunc := FO_MOVE
    else
      WFunc := FO_COPY;
    PFrom := Pointer(SrcBuf);
    PTo := PWideChar(Dest);
    FFlags := FOF_ALLOWUNDO;
    if AutoRename then
      FFlags := FFlags or FOF_RENAMEONCOLLISION;
    FAnyOperationsAborted := False;
    HNameMappings := nil;
    LpszProgressTitle := nil;
  end;
  Result := SHFileOperation(SHFileOpStruct);
  if Result = DE_SAMEFILE then
  begin
    SHFileOpStruct.FFlags := SHFileOpStruct.FFlags or FOF_RENAMEONCOLLISION;
    Result := SHFileOperation(SHFileOpStruct);
  end;

  SrcBuf := nil;
end;


Добавлено через 2 минуты и 26 секунд
Да и видимо проблема у вас в том, что:
Цитата

pFrom

    Type: PCZZTSTR
 ... The last file name is terminated with a double NULL character ("\0\0") to indicate the end of the buffer.



Это сообщение отредактировал(а) Illusion Dolphin - 21.3.2015, 08:43


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Jaroslav285
Дата 7.4.2015, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.1.2015
Где: Черкассы, Украина

Репутация: нет
Всего: нет



проблему решил, хоть и не самым лучшим образом, добавил к имени папки в начале два символа таблицы ASCII, теперь название папки выглядит так - ■ Backup
Всем спасибо за участие и помощь.   Cимволы Alt+254 и Alt+255

Это сообщение отредактировал(а) Jaroslav285 - 7.4.2015, 21:45
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1248 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.