powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отложенное удаление папки в %Temp%
17 сообщений из 17, страница 1 из 1
Отложенное удаление папки в %Temp%
    #39441327
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня инсталлятор устроен как "один в другом", даже наверно их 3 если быть точным

I.Внешний setup.exe (Inno Setup) не имеет интерфейса
1) Ложит ПАПКУ в %temp%: типа %temp%/MyProga
2) запускает промежуточный (из ПАПКИ)

II.Промежуточный (мой Exe, не .Net, лежит в ПАПКЕ):
1) выполняет типа обслуживание при необходимости: удаление предыдущей версии, проверка/установка версии .Net и т.п
2) запускает основной setup.exe (из ПАПКИ)

III.Основной setup.exe (Smart Install Maker, лежит в ПАПКЕ) - собственно основной установщик

Здесь как бы основной вопрос философии - как удалить ПАПКУ .
Потому как она "закушена" тем или иным образом в общем случае на любой из стадий.
Делалась такая система давно,
заложен механизм удаления из самой программы потом, когда осуществляется "первый запуск".
Но я тут понял, что в процессе усовершенствования прог это условие "первый запуск" перестало всегда выполняться (не выполняется при переустановке проги/версии без удаления настроек).
Плюс удаления не происходит если пользователь отказался от установки например на втором этапе (на это мной изначально было забито, хотя знал что это так).
и т.п.
В итоге есть хорошая вероятность, что ПАПКА в %temp% (а это может быть 50-100MB) вообще не удалится.
Оно конечно %temp% и глазу не заметно, но что говорить, халтура еще та.

Есть способ гарантированно заказать удаление папки?
Т.е. например безусловно и сразу прописать в систему чтоб удалила ее при перезагрузке, но не раньше (ну если конечно "первый запуск" не удалит ее раньше).
Как сделать?

P.S. Инсталляторы (во всяком случае отличные от 2-х упомянутых, что я использую) обсуждать не готов/не хочу, нужен ответ на вопрос.
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39441340
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется задавал уже недавно похожий вопрос.
Программно заменить системный файл
Хотя там данный совет оказался лишним и бесполезным (справился кстати без перезагрузки).
Да и баг однако MS исправил - через год после того как они этот баг сделали, и только после правильным образом оказанного давления.


John WJohn W [MSFT] replied on November 19, 2016See post history
Microsoft
Accomplishments
ReplyIn reply to John W [MSFT]'s post on October 8, 2016

Hi folks,

I know you're all anxious to see the fix from Microsoft for this, so I wanted to provide an update. We have produced and tested a fix for the problem, we've integrated it into the latest roll-up and are now testing that roll-up to make sure the integral package is solid.

Test passes vary in terms of the time they take so (as usual) I can't give you an exact date, but I'm definitely hoping it'll come through the testing with flying colors and be available soon.

Thanks for your continued patience, I know this has been a tough one. :-/

Best,

John Wink [MSFT]

John W [MSFT]
(ладно, мы люди скромные).

А вот счас это возможно то что надо.
PendingFileRenameOperations ?
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39441351
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, мысли вслух.
6 лет назад я эту хрень делал
Собственно описание как сие сделано.
Setup в Setup-е + "перезагрузить компьютер сейчас" из внутреннего Setup

А по поводу как удалить, наверно лучше не PendingFileRenameOperations с копанием в реестре и точно не Русинович,
а довериться API:
MoveFileEx function

RemarksIf the dwFlags parameter specifies MOVEFILE_DELAY_UNTIL_REBOOT, MoveFileEx fails if it cannot access the registry. The function stores the locations of the files to be renamed at restart in the following registry value:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

This registry value is of type REG_MULTI_SZ. Each rename operation stores one of the following NULL-terminated strings, depending on whether the rename is a delete or not:

•szDstFile\0\0
•szSrcFile\0szDstFile\0

The string szDstFile\0\0 indicates that the file szDstFile is to be deleted on reboot. The string szSrcFile\0szDstFile\0 indicates that szSrcFile is to be renamed szDstFile on reboot.

Note Although \0\0 is technically not allowed in a REG_MULTI_SZ node, it can because the file is considered to be renamed to a null name.

The system uses these registry entries to complete the operations at restart in the same order that they were issued. For example, the following code fragment creates registry entries that delete szDstFile and rename szSrcFile to be szDstFile at restart:

C++
Код: plaintext
1.
2.
MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39441359
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, надо было по себе поиск делать а не по гуглу:
19748882
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39441956
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Намудохался конечно с этим и с перезагрузками, но в итоге сделал.
В процессе выяснилось что пустую папку MoveFileEx не удаляет, надо сперва прописывать удаление всех файлов в ней.
MoveFileExThe system deletes a directory that is tagged for deletion with the MOVEFILE_DELAY_UNTIL_REBOOT flag only if it is empty. To ensure deletion of directories, move or delete all files from the directory before attempting to delete it.

.Net код достаточно простой:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  Public Const MOVEFILE_DELAY_UNTIL_REBOOT = &H4

  Public Declare Unicode Function MoveFileEx Lib "Kernel32.dll" Alias "MoveFileExW" _
   (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Integer) As Boolean
'===
    Dim szSrcFolder As String = IO.Path.Combine(IO.Path.GetTempPath(), "MyProga")
...
    MoveFileEx(IO.Path.Combine(szSrcFolder, "dotNetFx45_Full_setup.exe"), vbNullString, MOVEFILE_DELAY_UNTIL_REBOOT)
    MoveFileEx(IO.Path.Combine(szSrcFolder, "setup.exe"), vbNullString, MOVEFILE_DELAY_UNTIL_REBOOT)
    MoveFileEx(szSrcFolder, vbNullString, MOVEFILE_DELAY_UNTIL_REBOOT)



Но пришлось все делать в VB6, т.к. удаление в Temp может потребоваться до установки требуемой .Net
Там чуть тяжелее %temp% вычислять (хотя можно было сжульничать, потому как у меня де-факто
szTempFolder ==%temp%/MyProga == App.Path), и ANSI пришлось лепить по старинке (VB6 не дружит нормально с W-функциями).

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
  '========================================
  ' отложенное удаление папки %temp%\MyProga вместе с файлами в ней
  Dim szTempFolder As String
  szTempFolder = GetLongPath(GetTempDir()) & "MyProga"
...
  MoveFileEx szTempFolder & "\dotNetFx45_Full_setup.exe", vbNullString, MOVEFILE_DELAY_UNTIL_REBOOT
  MoveFileEx szTempFolder & "\setup.exe", vbNullString, MOVEFILE_DELAY_UNTIL_REBOOT
  MoveFileEx szTempFolder, vbNullString, MOVEFILE_DELAY_UNTIL_REBOOT
  '========================================

Option Explicit

'File Management Functions
Public Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Public Declare Function GetLongPathName Lib "kernel32" Alias "GetLongPathNameA" _
 (ByVal lpszShortPath As String, ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long
 
Public Const MOVEFILE_DELAY_UNTIL_REBOOT = &H4

Public Declare Function MoveFileEx Lib "Kernel32.dll" Alias "MoveFileExA" _
 (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) As Boolean

Public Function GetTempDir() As String
  Dim evar As String
  Dim elen As Long
  evar = String(256, " ")
  elen = GetTempPath(Len(evar), evar)
  If elen = 0 Then
    GetTempDir = ""
  Else
    evar = Left(evar, InStr(evar, Chr(0)) - 1)
    GetTempDir = CorrectDir(evar)
  End If
End Function

  Public Function GetLongPath(ByVal strShort As String) As String
    Dim evar As String
    Dim elen As Integer
    evar = String(256, " ")
    elen = GetLongPathName(strShort, evar, Strings.Len(evar))
    If elen = 0 Then
      GetLongPath = strShort
    Else
      GetLongPath = CorrectDir(Strings.Left(evar, elen))
    End If
  End Function

Public Function CorrectDir(the_str As String) As String
  'аналог GoodPath
  If Not (Right(the_str, 1) = "\") Then
    CorrectDir = the_str & "\"
  Else
    CorrectDir = the_str
  End If
End Function



По хорошему можно это было сделать сразу из внешнего Inno Setup инсталлятора,
Есть там некая Pascal Scripting: RestartReplace ,
Pascal Scripting: RestartReplacePrototype:
Код: pascal
1.
procedure RestartReplace(const TempFile, DestFile: String);

Description:
Renames TempFile to DestFile the next time Windows is started. If DestFile already existed, it will be overwritten. If DestFile is '' then TempFile will be deleted. An exception will be raised upon failure.
суть обертка над тем же самым MoveFileEx+MOVEFILE_DELAY_UNTIL_REBOOT == PendingFileRenameOperations RegKey
но еще паскаля мне не хватало, и так уже неплохо.
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39442040
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77но еще паскаля мне не хватало
c/c++ достаточно
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39442049
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилc/c++ достаточно
У меня вот это
Дмитрий77II.Промежуточный (мой Exe, не .Net, лежит в ПАПКЕ):
1) выполняет типа обслуживание при необходимости: удаление предыдущей версии, проверка/установка версии .Net и т.п
2) запускает основной setup.exe (из ПАПКИ)
УЖЕ написано на VB6, VC-рантаймов не просит, .Net -версий не надо,
при этом GUI-интерфейс и некая логика, и УЖЕ написано.
Туда несколько строк кода вставить - самое простое.
Смысл мне его на C++ переписывать? (да и не пишу я GUI на C никогда)

А паскаль это встроенный язык Inno Setup, первый пункт моего инсталлятора
I.Внешний setup.exe (Inno Setup) не имеет интерфейса
1) Ложит ПАПКУ в %temp%: типа %temp%/MyProga
2) запускает промежуточный (из ПАПКИ)
и у меня чего-то сходу не получилось эту скрипт-строчку там родить.

Да и пофиг, первый пункт всегда hide, второй пункт всегда запускается (если запустили первый).
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39442545
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77P.S. Инсталляторы (во всяком случае отличные от 2-х упомянутых, что я использую)
А зря. Продолжайте есть кактус
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39442551
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

Ну это да, по существу вопроса дополнение, конечно.
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39442583
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77Cat2,

Ну это да, по существу вопроса дополнение, конечно.
Разумеется по существу, если уже давно есть ClickOnce, а Вы продолжаете шаманить тремя своими инсталляторами
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39442707
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Разумеется по существу, если уже давно есть ClickOnce, а Вы продолжаете шаманить тремя своими инсталляторами
Нет, не по существу.
Никакой новый инсталлятор автоматом/пулеметом не решит ВСЕХ установочных задач в комплексе, а они у меня отнюдь не тривиальные и как правило не сводятся к распаковке файлов в папку программы. Это и грамотное удаление предыдущей версии (целиком, с сохранением настроек), проверка OS, версии .Net и т.п., и установка драйверов, девайсов, проверка/доустановка компонентов OS, ролей сервера и т.п.
А у меня эти все задачи УЖЕ продуманно решены ("тремя своими инсталляторами").
Я в любом случае не обойдусь без своих "доинсталляторов".

Почему используется Inno Setup в дополнении к Smart Install Maker (а он очень удобный!!!), могу объяснить.
Автор Smart Install Maker перестарался, пытаясь сделать свою прогу лучше. setup.exe, сделанный этой прогой, невозможно подписать цифровой подписью, это приводит к ошибке "Неправильный md5 файла" после подписывания. (Я пытался писать, но ответа не получил.) Поэтому подписываем внешний setup.exe, сделанный через Inno Setup, куда первый запакован.

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

А вы мне еще неделю хотите сказки про какие-то кактусы рассказывать.
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39443078
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,
че хочу добавить, раз про инсталляторы речь зашла.
В принципе, ДА, Smart Install Maker как бы заменить не помешало бы.
Я счас Win2016 тестовый накатал, и забыл "Home Location" с US на RU переключить, как обычно делаю, ну и тестировать стал.
Короче, ЮНИКОД он не поддерживает, а это крюкозябры на "русском варианте" - если юзер недалекий и не ставит/ не знает, что "русский" для НЕ-ЮНИКОДА ставить надо в системе для комфортной жизни.
Ну и этот мой промежуточный, кот. на VB6, тоже туда же (насчет Inno Setup не знаю, но основным его делать не хочу - кабы запутан он слишком и GUI не на уровне).
Вот, проги сами как бы юникодные давно, а здесь вот такой прокольчик, каюсь.
Но повторюсь, рассуждения эти к рассматриваемому вопросу близко не стояли,
так, задачка на перспективу.
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39443144
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

А мне NSIS нравился, ещё в те далёкие бородатые времена, когда это было актуально. Ща ClickOnce или тип того, да. Без прав администратора. Скачиваешь милипусенький стартер, который выкачивает что нужно и разворачивает в профиле пользователя. Маздайные инсталлеры делать не выгодно, просто потому что все ушли на веб, а тратить кучу времени ради полтора пользователя, это не достойно.
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39443145
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Накаркал что называется.

Спрашиваются, зачем эти писатели инсталляторов умничают. Один checksum зачем-то проверяет, что файл подписать нельзя.

Короче фигня чего-то получается.
InnoSetup (который запускается первый) сам знает фичу про PendingFileRenameOperations и не дает инсталлятору запуститься, если там что-то есть.

А на деле имеем следующее.
Я запустил setup.exe, потом на каком-то дальнейшем этапе установку отменил. При этом у меня прописалось удаление мусора в PendingFileRenameOperations (мне в принципе пофиг сколько раз оно туда пропишется и есть ли нет реально уже этого "мусора").

Дык вот, потом взял, запустил setup.exe второй раз, он не запускается, пишет, типа предыдущая инсталляция не завершена, перегрузи комп (потому как видит в реестре этот самый PendingFileRenameOperations). Причем у меня это окно еще скрыто кодом:
Код: pascal
1.
2.
3.
  WizardForm.BorderStyle := bsNone;
  WizardForm.Width := 0;
  WizardForm.Height := 0;



Вот и не знаю, как обходить эту "фичу", если только из-под самого этого Inno Setup прописывать код удаления ключа PendingFileRenameOperations перед тем как он его обнаружил (если сумею). Но здесь тоже неправ, а вдруг кто-то туда тоже что-то прописал кроме моего.
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39443163
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

По-моему это ты чет нарукожопил со своими инсталляторами :)
Нормальные инсталлеры отлично подчищают за собой и умеют чистить после перезагрузки.
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39443259
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77если только из-под самого этого Inno Setup прописывать код удаления ключа PendingFileRenameOperations перед тем как он его обнаружил (если сумею).
Обманул,
Код: pascal
1.
2.
3.
procedure InitializeWizard();
begin
  RegDeleteValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager', 'PendingFileRenameOperations');


но это конечно не очень правильно (риск удалить "чужое задание").

hVostt,
ну ты перед тем как слова употреблять, да еще адресно,
сначала бы перечитал топик с начала, тогда б тебе стало ясно, что, почему я так делаю.

Нарукожопили здесь авторы Inno Setup - Потому как Inno Setup лезет куда его не просят и делает выводы, о которых его не просят. Не InnoSetup положил в 'PendingFileRenameOperations' задание что-то удалить. Его дело - запустить инсталлятор, как прописано в его скриптах, а останавливать инсталляцию, потому что автор Inno Setup так думает (а не я, который эту инсталляцию пишет) -это неправильно.

>а ClickOnce ...Без прав администратора. ... разворачивает в профиле пользователя.
Да уж. Интересно как я без прав админа в профиле пользователя буду драйвера и компоненты OS устанавливать. Веселый ClickOnce.

Да нормальные они все, старые инсталляторы. Если б еще их авторы не умничали. А если уж умничаешь, не поленись галку сделать в GUI, типа "умничать/не умничать".
Потому что действительно ж*пу ж*пой лечить приходится.
...
Рейтинг: 0 / 0
Отложенное удаление папки в %Temp%
    #39444023
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Да нормальные они все, старые инсталляторы. Если б еще их авторы не умничали. А если уж умничаешь, не поленись галку сделать в GUI, типа "умничать/не умничать".
Потому что действительно ж*пу ж*пой лечить приходится.

Всем не угодишь. Иногда приходится делать форк некоторых проектов, которые годами всех устраивали, и вот исключительно твой случай там не работает. Форкаешь, допиливаешь, отправляешь пулл реквест.

С вендорными и старыми инструментами в этом отношении хуже. Ни исходников, ни возможности пофиксить чужой баг. Приходится рукожопить
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отложенное удаление папки в %Temp%
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]