Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаление файлов

465
11 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Некоторые деинсталляторы пишут при удалении программы что оставшиеся файлы и папки не возможно удалить в данный момент, но они будут удалены при следующей перезагрузке. И действительно они исчезали при перезагрузке.
Как такое реализовать в своей программе?
7
12 ноября 2012 года
@pixo $oft
3.4K / / 20.09.2006
В реестре есть параметр с именем типа FilePendingRenameOperations или вроде того(ищи по ключевому слову Pending).Но это не совсем труЪ-путь,ибо придётся вручную писать в реестр.Для таких целей есть функция MoveFileEx,у которой одним из параметров можно установить флаг,который будет как раз помечать файлы на удаление при перезагрузке
В конце концов,в Windows линейки NT выполняемые файлы,если они не заблокированы,можно просто взять и…не просто переименовать,а даже переместить!Вот и всё
2.1K
11 ноября 2012 года
disputant
95 / / 28.05.2007
Ну пропишите сие действие в автозагрузку, образно говоря (методы есть разные...)
327
11 ноября 2012 года
UserNet2008
748 / / 03.04.2010
Цитата:
Некоторые деинсталляторы пишут при удалении программы что оставшиеся файлы и папки не возможно удалить в данный момент, но они будут удалены при следующей перезагрузке. И действительно они исчезали при перезагрузке.


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

Цитата:
Как такое реализовать в своей программе?


Вы как программист должны знать:
1) все пути катологов и файлов
2) все пути веток реестра
3) при удалении проверить работает ваша программа, если да, тогда удалить процесс из памяти

465
11 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: UserNet2008
Вы как программист должны знать:
1) все пути катологов и файлов
2) все пути веток реестра
3) при удалении проверить работает ваша программа, если да, тогда удалить процесс из памяти



Зачем мне проверять работает моя программа или нет???
Я знаю что она завершается, но при этом она не может удалить например длл внедрённую в explorer.exe.
Пути каталогов и файлов я разумеется знаю. Реестр не используется(вообще не люблю его использовать, где возможно обойтись не использую).

Цитата: UserNet2008
Это происходит потому-что процесс находится в памяти. Есть деинсталляторы которые проверяют работу процессов этой программы, если процесс работает деинсталлятор удаляет процесс(ы), а потом удаляет файлы. Но есть процессы которые удаляются только при перезагрузке т.е иначе рухнет ОС.



Да, всё верно. Но я специально баловался с Revo Uninstaller. Установил маленькую прогу, запустил и потом пытался деинсталлировать. Мне было предложенно завершить процесс, но у меня как раз была задача справоцировать ситуацию о которой я писал, и я отказался и продолжил удаление. Мне было сказанно что оставшиеся файлы будут удалены при перезагрузке.

Я пытался найти что нибудь в автозагрузке. Посмотрел в пуске "Все программы->Автозагрузка", в msconfig и нигде ничего не добавилось.
Тутже после перезагрузки вызвал диспетчер задач, но никаких новых для себя процессов не увидел(или уже слишком поздлно, или всё это делает какой нибудь до боли знакомый процесс).

Не знаю что и куда прописывает Revo Uninstaller, но работает как часы(несколько раз проверял).

465
11 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: disputant
Ну пропишите сие действие в автозагрузку, образно говоря (методы есть разные...)



Вот методы и интересуют.

Из вопроса по моему понятно что задача сформулированна, но как раз методы не известны.

327
12 ноября 2012 года
UserNet2008
748 / / 03.04.2010
Цитата:
Я пытался найти что нибудь в автозагрузке. Посмотрел в пуске "Все программы->Автозагрузка", в msconfig и нигде ничего не добавилось.
Тутже после перезагрузки вызвал диспетчер задач, но никаких новых для себя процессов не увидел(или уже слишком поздлно, или всё это делает какой нибудь до боли знакомый процесс).


На сколько я понял Вы хотите посмотреть, что происходит при перезагрузке. Думаю Вам поможет Process Monitor он может создать log-файл загрузки

465
12 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Спасибо вам пиксо софт, это достойная информация.

Не упомянул операционку, наверное в наши дни подразумевается 7-ка. Всё это безобразие происходит в ХР.

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

Но в любом случае спасибо, буду пробовать разные варианты.
465
12 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: UserNet2008

На сколько я понял Вы хотите посмотреть, что происходит при перезагрузке. Думаю Вам поможет Process Monitor он может создать log-файл загрузки



Тоже полезная информация. Разумеется у меня есть эта прога, но ни разу не использовал функционал о котором вы написали.
Этой прогой очень удобно проверять внедрилась длл или нет. Всяких процесс мониторов и менеджеров пруд пруди, а вот такую инфу показывают далеко не все.

2.1K
12 ноября 2012 года
disputant
95 / / 28.05.2007
http://support.microsoft.com/kb/179365/ru
Цитата: QWERYTY
Цитата: disputant
Ну пропишите сие действие в автозагрузку, образно говоря (методы есть разные...)



Вот методы и интересуют.

Из вопроса по моему понятно что задача сформулированна, но как раз методы не известны.



В системном реестре есть симпатичная ветка - программы, запускаемые РАЗОВО. По-моему, самое то, нет?

http://support.microsoft.com/kb/179365/ru

465
13 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Чёто ничё не выходит.

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

 
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
FS: TFileStream;
begin
   FS := TFileStream.Create(Путь к моему файлу, fmOpenRead, fmShareDenyNone);
end;
С самого начала я проверил самый простой вариант, удаление при перезагрузке

 
Код:
MoveFileEx(Путь к файлу, PWideChar('D:\'), MOVEFILE_DELAY_UNTIL_REBOOT);
Но к сожалению не проканало, при перезагрузках фаил на месте. До перезагрузки фаил никуда не перемещается.


DeleteFileW тоже после блокировки не проканывает.
Унлокер же справляется с таким файлом запросто.
465
13 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: QWERYTY
...
 
Код:
MoveFileEx(Путь к файлу, PWideChar('D:\'), MOVEFILE_DELAY_UNTIL_REBOOT);
Но к сожалению не проканало, при перезагрузках фаил на месте. До перезагрузки фаил никуда не перемещается.
...



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

7
13 ноября 2012 года
@pixo $oft
3.4K / / 20.09.2006
Естественно!А если указать 2-м параметром пустую строку,то он удалится,насколько я помню
Ежели очень хочется удалить запущенный модуль,то его прежде надо выгрузить.Правда,я не знаю,насколько проста в реализации будет выгрузка определённого модуля изо всех процессов,в которые он загружен(и насколько стабильно это будет,ибо функции из модуля могут быть вызваны в самый неподходящий момент)

А DLL блокируется с целью извлечения из неё ресурсов в дальнейшем,да и не все секции сразу подгружаются в память при загрузке оной
465
14 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Спасибо. Действительно вторым параметром поставил NIL, и фаил после перезагрузки исчез в небытие.

Разбираться как его удалить сразу не буду(не к чему это).
Просто не люблю писать программы которые гадят после себя, и хотел подчистить. Презераю программы которые "забывают" почистить при удалении за собой реестр, временные папки(куда например инсталлятор распаковывается при установке), в документах и настройках и т.д.

Проблема решена, и даже нет ощущения как иногда бывает что как то криво.

то @pixo $of
Ваш пост который я пометил плюсом можно считать ответом на вопрос.


Всем спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог