Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.13;
Скачать: CL | DM;

Вниз

Копирование файлов с помощью SHFileOperation   Найти похожие ветки 

 
Vovchik   (2002-04-27 19:51) [0]

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

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


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

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

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


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

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

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


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

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

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


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

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


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

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

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

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


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

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


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

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


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

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

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


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

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

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

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


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

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

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

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


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

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


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

ОК!



Страницы: 1 вся ветка

Текущий архив: 2002.05.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
1-39783
TAV48
2002-04-28 15:22
2002.05.13
Арифметические выражения. Очень срочно надо.


1-39781
hogus
2002-04-28 08:03
2002.05.13
Работа с Временем (TDateTime)


6-39808
kazakh
2002-01-28 16:02
2002.05.13
Telnet и еще раз telnet


7-39869
NW
2002-02-14 19:07
2002.05.13
Виртуальный логический диск


1-39745
lipskiy
2002-04-22 13:40
2002.05.13
TWebBrowser_V1: Как запретить ему показывать страницу