Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Копирование файлов с помощью SHFileOperation [D4, D5, D6, Win95/98, WinME, NT4, Win2k, WinXP]


Vovchik ©   (2002-04-27 19:51:00) 

Это не вопрос, а ответ. Всем интересущимся копированием файлов. Вот только что выложил обещанный пример программы: http://delphi.mastak.ru/cgi-bin/download.pl?get=1019922539&n=1.

И никаких проблем при написании не возникло.


Vovchik   (2002-04-27 21:55:00) [1]

ОК!


Anatoly Podgoretsky   (2002-04-27 21:47:00) [2]

Да бог с ней избыточность, давай закончим на этом дисскуссию, я обратил на жто внимание, а уж другое дело следовать это или нет.


Vovchik   (2002-04-27 21:37:00) [3]

Да я не спорю, просто получается избыточность.

>флаг ставится если для каждого файла указывается свой путь

Да, но если флага нет - то значит путь один, и значит не надо искать два нуля. Как ни крути, а избыточность всё же есть.


Anatoly Podgoretsky   (2002-04-27 21:25:00) [4]

Не совсем так, флаг ставится если для каждого файла указывается свой путь. Во вторых параметр не обязан быть каталогом, а может быть именем файла.

В FAQ сайта этой ошибки нет, правда пока кто нибудь не вздумает переделать пример под свои нужды.

Насчет обязательно искать два нуля или один, сказано одназначно, обязано быть два нуля, я еще раз подчеркиваю сам попался на подобной ошибке, проявляется только при использовании более одного раза с одним и тем же буфером. По моему чего спорить сказано два, значит надо использовать два, а не делать предположение сколько нулей будет искать функция.


Vovchik   (2002-04-27 21:12:00) [5]

Стоп. В качестве назначения указывается каталог или файл в единственном числе. Если надо много, то ставится этот самый флаг.
Я хочу сказать, что у ф-ции есть информация, ей не обязательно искать концовку строки в виде двух нулей, если не указан соответствующий флаг.

Но, формально, лучше два нуля.


Anatoly Podgoretsky   (2002-04-27 21:07:00) [6]

Каталог то один, а файлов может быть много или даже не много а один файл, а не каталог. Ошибка не сразу обнаруживается, по себе знаю :=)


Vovchik   (2002-04-27 21:01:00) [7]

Возможно, я не настаиваю. Просто я потестил эту прогу и копировала она нормально. А насчёт того, что ф-ция не знает, это не совсем так. Если не указан флаг FOF_MULTIDESTFILES, то можно считать, что каталог назначения один.


Anatoly Podgoretsky   (2002-04-27 20:51:00) [8]

Vovchik © (27.04.02 20:31)
К сожалению нет, я сам не первых порах попадался на этом и ошибка подлая не каждый раз вылазит. К тому же фунция не может знать чколько файлов передано в списке, двойной ноль как раз об этом и сигнализирует.
Если ты помнишь начало истории, когда я предложил написать пример, так вот две основные ошибки при работе в SHFileOperation это

1. неполная инициализация структуры;
2. этот самый преслоутый ноль.

Если будет ошибка, то как правило не AV, а 1026, в хелпе поставляемым с Дельфи этого кода нет, что и затрудняло обнаружение причины.


Vovchik   (2002-04-27 20:31:00) [9]

Да, формально согласен. Но есть маленькое замечание. Возможно, это имеет значение только для Multiple names (т.е. указан флаг FOF_MULTIDESTFILES), а если имя только одно, то, возможно, разницы нету. Если бы ф-ция реально пыталась обратиться к символу, следующему за последним символом, то наверное было бы Access violation.
Но, формально, да, надо два нуля. Мой недосмотр.


Anatoly Podgoretsky   (2002-04-27 20:19:00) [10]

Вообще то это pTo:=PChar(DDirname.Text); надо записать так pTo:=PChar(DDirname.Text+#0);

Сразу не обратил внимания "The list of names must be double null-terminated." для pFrom это сделано.


Vovchik   (2002-04-27 20:11:00) [11]

> Anatoly Podgoretsky © (27.04.02 20:07)
Спасибо за оценку моей скромной поделки.

А что упрощать-то? Проще некуда. Мне так кажется. И так выброшены всякие навороты, типа задания имени для каждого копируемого файла (копирование+переименование) и вывод прогресс-бара.


Anatoly Podgoretsky   (2002-04-27 20:07:00) [12]

Если кто сомневается, то подтверждаю, пример в части работы с самой функциией SHFileOperation написан правильно, не в пример другим примерам.

2 Vovchik
Может стоило его выложить в FAQ в упрощенном виде, только саму часть работа с SHFileOperation и упростить немного?


Наверх

Титульная страница Поиск, карта сайта Написать письмо