Коллеги, ситуация такая:
1) Программа создает на диске файл.
2) Этот файл запускается в ассоциированном приложении через ShellExecute
3) После отработки файл необходимо с диска удалить.
И вот проблема - файл удаляться не хочет.
Стандартная функция REMOVE выдает ошибку 5 (Access Denied)
API-функция API_Remove выдает ошибку -1 (типа, не состоялось)
Для запуска ShellExecute я использую "ShellEx from Sterling Data".
Самое интересное, что файл-то на самом деле прекрасно удаляется в Explorer'е (и программу для этого гасить не нужно).
Игорь Смирнов.
Написал: ClaList(2)
Не удаляется файл после ShellExecute
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Возможно попытка программно удалить файл производится слишком рано: приложение запущенное через ShellExecute еще не закрыло его.
Как определяется момент когда файл освободили и его можно удалить?
Попробуйте удалять файл в течении некоторого времени (ну по таймеру на окне делать, например, попытки удалить с интервалом 5 сек в течении 1 минуты).
Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)
Как определяется момент когда файл освободили и его можно удалить?
Попробуйте удалять файл в течении некоторого времени (ну по таймеру на окне делать, например, попытки удалить с интервалом 5 сек в течении 1 минуты).
Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)
Пробовал - не получается.
Внешнее приложение уже давно закрыто, времени прошло достаточно - файл все равно не удаляется.
Я подозреваю, что в тех шаблонах для ShellExecute, что я использую, что-то некорректное. Возможно, они не возвращают моей программе информацию о снятии блокировки файла.
Igor Smirnov
Написал: 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)
Ты используешь какую форму REMOVE - с файловой меткой или именем файла? Лучше, естественно, непосредственно через имя файла, не используя метку файловой структуры.
Какой файл? Точнее - драйвер?
Как запускается ShellExecute и Remove - в одном потоке или разных?
У меня на простеньком тесте все прекрасно удаляется.
Вплоть до того, что текстовый файл, открытый в блокноте, спокойно удаляется через Remove()!
Возможно, то приложение, которое открывает файл, что-то такое "шепчет" Винде, что она не дает удалять файл процессу-владельцу.
Ты попробуй на простеньком тесте - возможно, действительно, виновато именно приложение, открывающее файл?
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Ну вот кусок кода (с комментариями):
При этом все нормально отрабатывается - запускается внешнее приложение, файл в нем открывается и т.д.
Потом я закрываю это внешнее приложение. Все нормально. Файл на диске пока еще есть.
Но вот потом (это задейтвовано на кнопку выхода из процедуры) такой код:
Или вот такой (это уже вызов API-функции)
Здесь выдается ошибка -1
И файл, соответственно, не удаляется.
Тем не менее еще даже до вызова какого-либо варианта REMOVE (см. выше) я могу, пользуясь многозадачностью Windows, переключиться в Explorer (или какой-нибудь Windows Commander) и там спокойненько файл удалить. И он прекрасно удаляется.
Igor Smirnov
Написал: 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)
Код: Выделить всё
IF sav_FileName
r#=API_Remove(sav_FileName)
END
И файл, соответственно, не удаляется.
Тем не менее еще даже до вызова какого-либо варианта REMOVE (см. выше) я могу, пользуясь многозадачностью Windows, переключиться в Explorer (или какой-нибудь Windows Commander) и там спокойненько файл удалить. И он прекрасно удаляется.
Igor Smirnov
Написал: ClaList(2)
Все. Отбой. Нашел багу.
Оказывается, не нужно обрамлять полное имя файла двойными кавычками.
И что самое интересное - я специально пихнул программу в путь с именем, содержащим пробеллы - все равно работает.
Вот эта инструкция была лишней:
sav_FileName='"' & BF::Name & '"' ! Окружаю имя файла двойными кавычками
Игорь Смирнов
Написал: ClaList(2)
Оказывается, не нужно обрамлять полное имя файла двойными кавычками.
И что самое интересное - я специально пихнул программу в путь с именем, содержащим пробеллы - все равно работает.
Вот эта инструкция была лишней:
sav_FileName='"' & BF::Name & '"' ! Окружаю имя файла двойными кавычками
Игорь Смирнов
Написал: ClaList(2)