Копирование средствами системы

Если вы разбираетесь в программировании (C++ Builder, Delphi), возможно вы сможете помочь в устранении проблемных мест в программе

Модератор: motyara

Закрыто
Аватара пользователя
Max Diesel
Автор программы
Сообщения: 3125
Зарегистрирован: Пт окт 12, 2007 9:00 pm
Контактная информация:

Копирование средствами системы

Сообщение Max Diesel » Вт мар 04, 2008 2:03 am

Функция копирования средствами системы использует всем известные SHFILEOPSTRUCT и SHFileOperation. Вот в такой интерпретации код вполне сносно мог работать в WinXP для AnsiString:

Код: Выделить всё

SHFILEOPSTRUCT fop;
fop.hwnd = NULL;
fop.wFunc = FO_COPY*!move | FO_MOVE*move;

fop.pFrom = String(file).c_str()+'\0';

fop.pTo = String(dest).c_str();
fop.fFlags=0;
fop.fAnyOperationsAborted=false;
fop.lpszProgressTitle=NULL;
fop.hNameMappings=NULL;
SHFileOperation(&fop);
Необходимо модернизировать этот код (или, если удастся, найти в интернете уже готовый) для работы в юникоде, то есть уже используются SHFILEOPSTRUCTW и SHFileOperationW, причем не для одного файла (имя которого содержится в переменной "file"), а для нескольких файлов (имена в переменных file1, file2 и тд). Буду признателен за помощь в этом вопросе (подобные системные функции, использующие массивы байтов вместо строк для входящих и исходящих параметров, зачастую ставят меня в тупик). [/color]

Аватара пользователя
maXmo
Охотник за багами
Сообщения: 98
Зарегистрирован: Пт ноя 09, 2007 8:03 pm

Re: Копирование средствами системы

Сообщение maXmo » Чт мар 06, 2008 12:56 pm

Ого! Там как бы не совсем простая sz-строка.
pFrom
Address of a buffer to specify one or more source file names. These names must be fully qualified paths. Standard Microsoft MS-DOS wild cards, such as "*", are permitted in the file-name position. Although this member is declared as a null-terminated string, it is used as a buffer to hold multiple file names. Each file name must be terminated by a single NULL character. An additional NULL character must be appended to the end of the final name to indicate the end of pFrom.

Аватара пользователя
maXmo
Охотник за багами
Сообщения: 98
Зарегистрирован: Пт ноя 09, 2007 8:03 pm

Re: Копирование средствами системы

Сообщение maXmo » Чт мар 06, 2008 2:53 pm

Код: Выделить всё

fop.pFrom = String(file).c_str()+'\0';
хе-хе, боюсь, этот код делает не совсем то, что вы от него ожидаете :)

Код: Выделить всё

int len=fnum+1;
for(int i=0;i<fnum;i++)len+=files[i].Length;
wchar_t *from=(wchar_t*)malloc(len*2), *str=from;
for(int i=0;i<fnum;i++)
{
	lstrcpy(str,files[i].c_str());
	str+=files[i].Length+1;
}
*str=0;
fop.wFunc = move?FO_MOVE:FO_COPY;
fop.pFrom = from;
fop.pTo = dest.c_str();
fop.hwnd = NULL;
fop.fFlags=0;
fop.fAnyOperationsAborted=false;
fop.lpszProgressTitle=NULL;
fop.hNameMappings=NULL;
SHFileOperation(&fop);
free(from);
не знаю, правильный ли метод c_str() для WideString, в общем, должно быть понятно.
Max Diesel писал(а):подобные системные функции, использующие массивы байтов вместо строк для входящих и исходящих параметров, зачастую ставят меня в тупик
да ладно, какие могут быть проблемы с массивами? Это ж фундаментальный тип данных С.

Аватара пользователя
Max Diesel
Автор программы
Сообщения: 3125
Зарегистрирован: Пт окт 12, 2007 9:00 pm
Контактная информация:

Сообщение Max Diesel » Чт мар 06, 2008 8:45 pm

Спасибо, работает как надо.
maXmo писал(а):да ладно, какие могут быть проблемы с массивами? Это ж фундаментальный тип данных С.
Боюсь что когда другие в университете изучали фундаментальные типы данных Си, я в это время находился в совершенно другой аудитории изучая совершенно другие предметы... фактически образование у меня экономическое, факультет программирования (ну или как там это называлось...) не пожелал меня принять в свои ряды. Вероятно поэтому по части программирования временами у меня встречаются "пробелы в образовании" размером с тихий океан.

Аватара пользователя
Max Diesel
Автор программы
Сообщения: 3125
Зарегистрирован: Пт окт 12, 2007 9:00 pm
Контактная информация:

Сообщение Max Diesel » Пт мар 07, 2008 9:12 pm

Оказалось, что получившийся код корректно работает опять-таки в WinXP, а вот Vista не смогла его понять. Впрочем, я в результате использовал метод с Ctrl+C и Ctrl+V и его даже Vista осилила без лишних ухищрений (вообще этот метод я изначально не хотел использовать, но при отсутствии вариантов и он подойдет).

Аватара пользователя
maXmo
Охотник за багами
Сообщения: 98
Зарегистрирован: Пт ноя 09, 2007 8:03 pm

Re: Копирование средствами системы

Сообщение maXmo » Вт апр 08, 2008 12:36 pm

Возможно, это связано с тем, что на висте размеры структур поменялись. При компиляции под висту надо выставлять правильный WINVER, вот народ напоролся на схожую проблему.

Аватара пользователя
Max Diesel
Автор программы
Сообщения: 3125
Зарегистрирован: Пт окт 12, 2007 9:00 pm
Контактная информация:

Сообщение Max Diesel » Ср июн 04, 2008 12:01 am

Подозреваю что причина все-таки не в этом...

astro
Сообщения: 2
Зарегистрирован: Пт авг 22, 2008 1:15 pm
Контактная информация:

Re: Копирование средствами системы в Vista

Сообщение astro » Пт авг 22, 2008 1:31 pm

из MSDN
SHFILEOPSTRUCT Structure
Contains information that the SHFileOperation function uses to perform file operations.
Note As of Windows Vista, the use of the IFileOperation interface is recommended over this function.

Закрыто