Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2015, 14:13   #1
Jaroslav285
 
Регистрация: 26.03.2012
Сообщений: 4
По умолчанию SHFileOpStruct не перемещает папки на флешке в NTFS

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

Жду Ваших ответов, буду рад любой помощи, заранее спасибо.
Jaroslav285 вне форума Ответить с цитированием
Старый 20.03.2015, 14:38   #2
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Или Юникодную делфи использовать или юникодный вариант TSHFileOpStruct + соответственно данные тоже в юникоде в него передавать
ZuBy вне форума Ответить с цитированием
Старый 20.03.2015, 15:57   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

А не проще скопировать в папку Backup и потом удалить эти файлы?
FaTaL вне форума Ответить с цитированием
Старый 20.03.2015, 16:51   #4
Jaroslav285
 
Регистрация: 26.03.2012
Сообщений: 4
По умолчанию

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

Возможно я не прав, направьте пожалуйста в правильное русло, спасибо за совет.
Jaroslav285 вне форума Ответить с цитированием
Старый 20.03.2015, 16:54   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
SHFileOpStructA невозможно использовать в моей версии, доступен только SHFileOpStructW.
Шта?? О_о
Как странно... А у меня Ансишные функции нормально вызываются, несмотря на устаревание.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.03.2015, 16:56   #6
Jaroslav285
 
Регистрация: 26.03.2012
Сообщений: 4
По умолчанию

Цитата:
А не проще скопировать в папку Backup и потом удалить эти файлы?
Копировать нельзя, нужно именно перемещать, иначе будут затраты времени, и возможно появятся новые проблемы...

Также процесс должен быть скрытым от пользователя, функция SHFileOpStruct прекрасно справляется с этой задачей, но есть трабл который я описал выше, а именно в файловой системе NTFS, но в любом случае спасибо за совет.

Цитата:
Как странно... А у меня Ансишные функции нормально вызываются, несмотря на устаревание.
Значит у меня что-то не так, подскажите как мне исправить в моей версии на Ansi вариант, просто при приведении к Ansi ругается именно на не соответствие, и еще читал о такой проблеме на каком-то форуме при изучении материалов по функции, поэтому так и написал Вам, если можно подскажете как исправить?

Цитата:
Как странно... А у меня Ансишные функции нормально вызываются, несмотря на устаревание.
Цитата:
Значит у меня что-то не так, подскажите как мне исправить в моей версии на Ansi вариант, просто при приведении к Ansi ругается именно на не соответствие, и еще читал о такой проблеме на каком-то форуме при изучении материалов по функции, поэтому так и написал Вам, если можно подскажете как исправить?

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

Последний раз редактировалось Stilet; 20.03.2015 в 21:46.
Jaroslav285 вне форума Ответить с цитированием
Старый 20.03.2015, 21:47   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Привел к SHFileOperationА
Код в студию )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.03.2015, 09:25   #8
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Цитата:
Копировать нельзя, нужно именно перемещать, иначе будут затраты времени, и возможно появятся новые проблемы...
А разве перемещение работает без копирования? Мне кажется так и происходит в винде. Сначала копирование, потом удаление - это и есть перемещение.
FaTaL вне форума Ответить с цитированием
Старый 21.03.2015, 09:46   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
разве перемещение работает без копирования?
Работает в рамках одного раздела. Физически файл не меняет местоположение, перезаписывается только его путь в файловой таблице.
Сам попробуй - файл гиг на 100 перемести в другой каталог. Он быстро туда попадет несмотря на размер.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.03.2015, 16:42   #10
Jaroslav285
 
Регистрация: 26.03.2012
Сообщений: 4
По умолчанию

Решил вопрос путем добавления последнего символа таблицы 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+':'+'\■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;
Всем спасибо за участие, тему можно закрывать.
Jaroslav285 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ntfs запретить всем создавать файлы и папки hon Windows 1 17.02.2014 09:23
Папки на флешке заменились другими emulsum Компьютерное железо 6 26.11.2012 21:44
Как открыть шаблон Word-a из папки в корневой папки программы :) flouwjke Общие вопросы Delphi 3 30.04.2012 00:25
Метод Insert не перемещает на указанный индекс желаемый таб в TabControl KorPaEv C# (си шарп) 1 20.12.2011 05:42
Вирус на флешке Aleksandr Компьютерное железо 27 13.01.2009 23:46