Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SHFileOpStruct не перемещает папки на флешке в NTFS

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Jaroslav285

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, столкнулся со следующей проблемой, программа должна перемещать файлы папки на флешке в папку 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;
 

 
 
Жду Ваших ответов, буду рад любой помощи, заранее спасибо.

Всего записей: 3 | Зарегистр. 14-01-2013 | Отправлено: 14:10 20-03-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А PChar разве Unicode строка?
Если нет, тогда SHFileOperationА надо использовать, а не W.

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 15:39 20-03-2015
Jaroslav285

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 
А PChar разве Unicode строка?  
Если нет, тогда SHFileOperationА надо использовать, а не W.  
 

 
В моей версии Delphi а это RAD Studio  XE5 я могу использовать только WideChar, SHFileOpStructA невозможно использовать в моей версии, доступен только SHFileOpStructW.
строка не в Юникоде, я передаю переменную в которой содержится буква или буквы подключенных носителей  из Memo
 
Добавлено:
 

Цитата:
 
А PChar разве Unicode строка?  
Если нет, тогда SHFileOperationА надо использовать, а не W.  
 

 

Цитата:
 
В моей версии Delphi а это RAD Studio  XE5 я могу использовать только WideChar, SHFileOpStructA невозможно использовать в моей версии, доступен только SHFileOpStructW.  
строка не в Юникоде, я передаю переменную в которой содержится буква или буквы подключенных носителей  из Memo
 

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

Всего записей: 3 | Зарегистр. 14-01-2013 | Отправлено: 16:48 20-03-2015 | Исправлено: Jaroslav285, 18:01 20-03-2015
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Отдельно код работает? Имеется ввиду не в рамках процедуры обработки сообщений, не в рамках нтфс флэшек (на харде, например). Почему именно шелл функцию юзаешь?
 
Добавлено:
Опять же, никогда не юзал эту функцию но на мсдн поля pfrom/pto значатся как PCZZTSTR, может и здесь собака порылась, хотя не представляю как. Но опыт подсказывает, что в винде не так много ошибок ) и что возвращает функция, когда отрабатывает коряво?

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 00:24 21-03-2015
Jaroslav285

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Решил вопрос путем добавления последнего символа таблицы ASCII перед именем папки, новый код прилагаю.
 

Код:
 
 
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+':'+'\&#9632;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+':\'+'&#9632;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;  
 
 

 
Всем спасибо за участие, тему можно закрывать.

Всего записей: 3 | Зарегистр. 14-01-2013 | Отправлено: 16:36 21-03-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SHFileOpStruct не перемещает папки на флешке в NTFS


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru