в чем хитрость удалить временную папку в установщике? - PullRequest
2 голосов
/ 29 сентября 2010

Я создаю установщик MSI через VS 2008. Я пытаюсь удалить временную папку в конце установки. Эта временная папка создается моим установщиком для хранения некоторых пакетных файлов для создания базы данных. Он всегда показывает, что другой процесс имеет к нему доступ и не позволяет моему коду удалить его. Я вызвал Close () этого процесса доступа. Я поставил спать перед кодом, чтобы удалить его. Ничего полезного.

У вас есть идеи, как я могу удалить его в конце установки?

спасибо,

Ответы [ 3 ]

0 голосов
/ 29 сентября 2010

Я могу подумать о создании командного файла во временной папке для запуска, который выполняется как последний шаг.Вы ставите паузу в нем с помощью команды ping (http://www.robvanderwoude.com/wait.php), а затем через несколько секунд (после завершения установки) удалите папку с помощью переданного параметра:

PING 1.1.1.1 -n 1 -w 60000 >NUL
rd "%1"

Это действительно взлом.лучше искоренить то, что блокирует вашу папку.

0 голосов
/ 18 мая 2014

Сначала я рассмотрю концептуальные проблемы в вашей настройке:

  • Прежде всего, как сказал «Vinay B R», убедитесь, что ваша папка «temp» находится под папкой Windows% TEMP%. Таким образом, вы можете оставить файлы там, если вам не удастся их удалить.

  • Почему именно вы хотите удалить пакетные файлы, когда закончите? Не ожидается, что вы очистите себя в папке% TEMP%.

  • Если вы хотите, чтобы пользователь не запускал их снова, вы можете назвать их с другим расширением файла (например, «.tmp» вместо .bat), выполнить их, используя этот метод здесь описано , , затем оставьте их позади:

    cmd < "%TEMP%foo.tmp"

  • Если вы пытаетесь удалить файлы, потому что не хотите, чтобы пользователь имел к ним доступ, то удалив их, вы защитите себя только от случайных пользователей.


Если вы все еще хотите удалить файлы, то:

  • По всей вероятности, ваш собственный процесс блокирует вашу папку. Использование Process Explorer, скорее всего, будет указывать на msiexec.exe или cmd.exe. Без сомнения, вы можете вручную удалить папку после выхода из MSI и SQL, верно? Если так, то ваш собственный процесс не заканчивается сразу же. Узнайте почему. Возможно, SQL занимает больше времени, чем вы думаете?

  • В качестве альтернативы методу Алиостада, вот «другой вкус», перечисленный в этой статье . Однако, как он писал, для вас было бы лучше определить, почему он заблокирован.

Process.Start("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del " +
    Application.ExecutablePath);
Application.Exit();


Вот рабочий пример на C #. Если у ваших пользователей будет установлен .NET, вы можете вызвать это как настраиваемое действие с помощью WiX DTF (установите WiX, затем в Visual Studio выберите «Новый проект» -> «Установщик Windows XML -> C # Custom Action Project»).:

// Note: This can also be used to delete this .exe (i.e.
// System.Windows.Forms.Application.ExecutablePath).
//
public static void AsynchDeleteFolder(string myTempFolderPath)
{
    ProcessStartInfo info = new ProcessStartInfo();

    // Don't create a visible DOS box.
    info.WindowStyle = ProcessWindowStyle.Hidden;
    info.CreateNoWindow = true;

    // Wait 3 seconds ("/T 3").
    info.Arguments = @"/C choice /C Y /N /D Y /T 3 & rmdir /S /Q """ +
        myTempFolderPath + @"""";

    info.FileName = "cmd.exe";
    Process.Start(info);
}


Если вы предпочитаете выполнять только соответствующую часть в виде пакетного файла, то вы можете избежать окна DOS, следуя этому методу .:

' Filename: Run_a_batch_file_with_no_popup_dos_box.vbs
'
' Invoke like this from the command line:
' wscript.exe Run_a_batch_file_with_no_popup_dos_box.vbs "c:\path with spaces to my file name.bat"
'
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & WScript.Arguments.Item(0) & Chr(34), 0
Set WshShell = Nothing
0 голосов
/ 29 сентября 2010

Вы пробовали Filemon, чтобы увидеть, кто обращается к временной папке, когда в папке вызывается удаление?Лучше использовать системный путь к временной папке

System.Environment.GetEnvironmentVariable("TEMP")

, вам не нужно беспокоиться о его очистке.

...