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

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

Модератор: motyara

Аватара пользователя
Max Diesel
Автор программы
Сообщения: 3432
Зарегистрирован: Пт окт 12, 2007 3:26 pm

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

Сообщение Max Diesel »

Функция копирования средствами системы использует всем известные 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 »

Ого! Там как бы не совсем простая 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 »

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

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
Автор программы
Сообщения: 3432
Зарегистрирован: Пт окт 12, 2007 3:26 pm

Сообщение Max Diesel »

Спасибо, работает как надо.
maXmo писал(а):да ладно, какие могут быть проблемы с массивами? Это ж фундаментальный тип данных С.
Боюсь что когда другие в университете изучали фундаментальные типы данных Си, я в это время находился в совершенно другой аудитории изучая совершенно другие предметы... фактически образование у меня экономическое, факультет программирования (ну или как там это называлось...) не пожелал меня принять в свои ряды. Вероятно поэтому по части программирования временами у меня встречаются "пробелы в образовании" размером с тихий океан.
Аватара пользователя
Max Diesel
Автор программы
Сообщения: 3432
Зарегистрирован: Пт окт 12, 2007 3:26 pm

Сообщение Max Diesel »

Оказалось, что получившийся код корректно работает опять-таки в WinXP, а вот Vista не смогла его понять. Впрочем, я в результате использовал метод с Ctrl+C и Ctrl+V и его даже Vista осилила без лишних ухищрений (вообще этот метод я изначально не хотел использовать, но при отсутствии вариантов и он подойдет).
Аватара пользователя
maXmo
Охотник за багами
Сообщения: 98
Зарегистрирован: Пт ноя 09, 2007 8:03 pm

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

Сообщение maXmo »

Возможно, это связано с тем, что на висте размеры структур поменялись. При компиляции под висту надо выставлять правильный WINVER, вот народ напоролся на схожую проблему.
Аватара пользователя
Max Diesel
Автор программы
Сообщения: 3432
Зарегистрирован: Пт окт 12, 2007 3:26 pm

Сообщение Max Diesel »

Подозреваю что причина все-таки не в этом...
astro
Сообщения: 2
Зарегистрирован: Пт авг 22, 2008 1:15 pm

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

Сообщение astro »

из 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.