Не удаляется файл после ShellExecute

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Коллеги, ситуация такая:
1) Программа создает на диске файл.
2) Этот файл запускается в ассоциированном приложении через ShellExecute
3) После отработки файл необходимо с диска удалить.
И вот проблема - файл удаляться не хочет.
Стандартная функция REMOVE выдает ошибку 5 (Access Denied)
API-функция API_Remove выдает ошибку -1 (типа, не состоялось)
Для запуска ShellExecute я использую "ShellEx from Sterling Data".
Самое интересное, что файл-то на самом деле прекрасно удаляется в Explorer'е (и программу для этого гасить не нужно).

Игорь Смирнов.
Написал: ClaList(2)
Гость

Сообщение Гость »

Возможно попытка программно удалить файл производится слишком рано: приложение запущенное через ShellExecute еще не закрыло его.
Как определяется момент когда файл освободили и его можно удалить?

Попробуйте удалять файл в течении некоторого времени (ну по таймеру на окне делать, например, попытки удалить с интервалом 5 сек в течении 1 минуты).

Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)
Гость

Сообщение Гость »

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

Igor Smirnov
Написал: ClaList(2)
Гость

Сообщение Гость »

Какой блокировки?!
Ты используешь какую форму REMOVE - с файловой меткой или именем файла? Лучше, естественно, непосредственно через имя файла, не используя метку файловой структуры.
Какой файл? Точнее - драйвер?
Как запускается ShellExecute и Remove - в одном потоке или разных?

У меня на простеньком тесте все прекрасно удаляется.
Вплоть до того, что текстовый файл, открытый в блокноте, спокойно удаляется через Remove()!
Возможно, то приложение, которое открывает файл, что-то такое "шепчет" Винде, что она не дает удалять файл процессу-владельцу.

Ты попробуй на простеньком тесте - возможно, действительно, виновато именно приложение, открывающее файл?

=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Ну вот кусок кода (с комментариями):

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

BF::Name=ProgramPath & '\' & My:FileName !Задаю полное (с путем) имя создаваемого файла на диске
CLOSE(BinFile) !На всякий случай его закрываю - вдруг открыт?
CREATE(BinFile) !Создаю заново
CheckOpen(BinFile) !Открываю
SET(BinFile) !Становлюсь в начало
BF:B=ByteString[1:(My:Size)] !Заполняю строковую переменную байтами (чтобы набить ими файл)
PUT(BinFile,1,(My:Size)) !Собственно, набиваю файл бинарными данными
CLOSE(BinFile) !Закрываю файл
sav_FileName='"' & BF::Name & '"' ! Окружаю имя файла двойными кавычками 
                                  !(могут быть пробелы в полном имени)
IMPURLHandler(0{PROP:Handle},sav_FileName) !Вызываю ShellExecute из шаблона от "Sterling Data"
При этом все нормально отрабатывается - запускается внешнее приложение, файл в нем открывается и т.д.
Потом я закрываю это внешнее приложение. Все нормально. Файл на диске пока еще есть.
Но вот потом (это задейтвовано на кнопку выхода из процедуры) такой код:

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

IF sav_FileName Then REMOVE(sav_FileName) . !Выдается ошибка 5 (Acces Denied)
Или вот такой (это уже вызов API-функции)

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

IF sav_FileName
 r#=API_Remove(sav_FileName)
END
Здесь выдается ошибка -1
И файл, соответственно, не удаляется.
Тем не менее еще даже до вызова какого-либо варианта REMOVE (см. выше) я могу, пользуясь многозадачностью Windows, переключиться в Explorer (или какой-нибудь Windows Commander) и там спокойненько файл удалить. И он прекрасно удаляется.

Igor Smirnov
Написал: ClaList(2)
Гость

Сообщение Гость »

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

Вот эта инструкция была лишней:

sav_FileName='"' & BF::Name & '"' ! Окружаю имя файла двойными кавычками

Игорь Смирнов
Написал: ClaList(2)
Ответить