删除安装程序中的临时文件夹有什么用?

时间:2010-09-29 18:39:08

标签: c# .net installer installation

我正在通过VS 2008创建MSI安装程序。我尝试在安装结束时删除临时文件夹。该临时文件夹由我的安装程序创建,用于保存一些批处理文件以创建数据库。它始终显示其他进程正在访问它,并且不允许我的代码删除它。我已经调用了该访问过程的Close()。我在代码之前把睡眠删除了。没什么用的。

你知道如何在安装结束时删除它吗?

感谢,

3 个答案:

答案 0 :(得分:0)

在文件夹上调用delete时,您是否尝试使用Filemon查看谁正在访问临时文件夹? 最好使用系统临时文件夹路径

System.Environment.GetEnvironmentVariable("TEMP")

您无需担心清理它。

答案 1 :(得分:0)

我可以考虑在temp文件夹中创建一个批处理文件,作为最后一步运行。你使用ping(http://www.robvanderwoude.com/wait.php)暂停一下,然后几秒钟后(安装程序已经退出)使用传递的参数删除文件夹:

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

这真的是一个黑客。最好根除锁定文件夹的内容。

答案 2 :(得分:0)

我首先要解决您的设置中的概念性问题:

  • 首先," Vinay B R"说,确保你的" temp"文件夹位于Windows%TEMP%文件夹下。这样,如果您无法删除它们,可以将文件保留在那里。

  • 为什么要在完成后删除批处理文件?不要期望您在%TEMP%文件夹中自行清理。

  • 如果您想确保用户不再运行它们,那么您可以使用不同的文件扩展名命名它们(例如" .tmp"而不是.bat),执行他们使用这种方法described here然后将它们留在后面:

    cmd < "%TEMP%foo.tmp"

  • 如果您尝试删除文件是因为您不希望用户有权访问这些文件,那么通过删除它们,您只能保护自己免受临时用户的攻击。<​​/ p>


如果您仍想删除文件,请:

  • 您自己的进程很可能会锁定您的文件夹。使用Process Explorer可能会指向msiexec.exe或cmd.exe。毫无疑问,一旦MSI和SQL退出,您就可以手动删除该文件夹,对吧?如果是这样,那么您自己的流程不会立即终止。找出为什么。 SQL可能比你想象的要长吗?

  • 作为Aliostad方法的替代方案,这里有其他风味&#34;列出in this article。然而,正如他所写的那样,最好确定它被锁定的原因。

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中选择New Project - &gt; Windows Installer XML - &gt; C#Custom Action Project)将其作为自定义操作调用。:< / p>

// 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