![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте, столкнулся со следующей проблемой, программа должна перемещать файлы папки на флешке в папку 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;
Жду Ваших ответов, буду рад любой помощи, заранее спасибо. |
|
#2
|
|||
|
|||
|
Решил вопрос путем добавления последнего символа таблицы 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; Всем спасибо за участие, тему можно закрывать. |