Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2011, 22:18   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Вопрос Не всегда работает удаление файла/каталога через SHFileOperationA

Код:

Код:
function RemFF(const ARemPath:AnsiString):Boolean;
var
  LShellInfo:TSHFileOpStructA;
begin

//TODO - не всегда срабатывает! разобраться!

  with LShellInfo do
  begin
    Wnd:=0;
    wFunc:=FO_DELETE;
    pFrom:=PAnsiChar(ARemPath);
    pTo:=nil;
    fAnyOperationsAborted:=False;
    fFlags:=FOF_NOCONFIRMATION;
    hNameMappings:=nil;
    lpszProgressTitle:=nil;
  end;
  Result:=SHFileOperationA(LShellInfo)=0;
end;
Удаляет указанный файл/каталог, но отнюдь невсегда! функция работает вообще хаотично с переменным успехом. В чем дело, не подскажете?

______________
Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.

Учтите это на будущее.

Модератор.
"ковыряю изнутри" (с)

Последний раз редактировалось Serge_Bliznykov; 22.09.2011 в 22:53.
3D Hunter вне форума Ответить с цитированием
Старый 23.09.2011, 14:39   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Во-первых, при неудаче функция возвращает код ошибки, который указывает причину, почему нельзя выполнять операцию. Вы этот код глушите. Почему? Почему бы не показать в чём причина через хотя бы ShowMessage?

Далее, F1:
Цитата:
pFrom

Note: This string must be double-null terminated.

...

Although this member is declared as a single null-terminated string, it is actually a buffer that can hold multiple null-delimited file names. Each file name is terminated by a single NULL character. The last file name is terminated with a double NULL character ("\0\0") to indicate the end of the buffer.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 24.09.2011, 09:17   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Не смотрел в справке и мсдне, сорри... т.е. если я даже вызываю анси-вариант этой функции, то в pFrom должен передавать
Код:
pFrom:=PAnsiChar(ARemPath+#0#0);
Просто если PAnsiChar дает только указатель pFrom'у, то нужно предварительно добавить два нулевых символа к строке-параметру метода? Я правильно понял?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 24.09.2011, 12:39   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Да.

Функция принимает список файлов, а не один файл. Конец списка указывается двойным терминатором.

В оригинальном коде у вас терминатор был одинарным (скрытый, от внутренней реализации строк). А за ним мог идти и ноль и не ноль - там мусор.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 24.09.2011, 14:47   #5
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Спасибо большое!
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c# удаление каталога world12_tk Помощь студентам 12 08.01.2011 11:29
Удаление каталога Linel PHP 11 10.03.2010 17:31
Удаление каталога Manager Общие вопросы C/C++ 1 24.10.2009 11:30
Не работает отправка файла через сокет SARGE Работа с сетью в Delphi 0 29.01.2009 13:29
удаление каталога Volkogriz Общие вопросы Delphi 7 23.12.2008 19:36