Страница 1 из 1

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

Добавлено: Вт мар 04, 2008 2:03 am
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]

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

Добавлено: Чт мар 06, 2008 12:56 pm
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.

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

Добавлено: Чт мар 06, 2008 2:53 pm
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 писал(а):подобные системные функции, использующие массивы байтов вместо строк для входящих и исходящих параметров, зачастую ставят меня в тупик
да ладно, какие могут быть проблемы с массивами? Это ж фундаментальный тип данных С.

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

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

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

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

Добавлено: Ср июн 04, 2008 12:01 am
Max Diesel
Подозреваю что причина все-таки не в этом...

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

Добавлено: Пт авг 22, 2008 1:31 pm
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.