【发布时间】:2010-09-29 18:39:07
【问题描述】:
我正在通过 VS 2008 创建 MSI 安装程序。我尝试在安装结束时删除临时文件夹。该临时文件夹由我的安装程序创建,用于保存一些用于创建数据库的批处理文件。它总是显示其他进程正在访问它并且不允许我的代码删除它。我已经调用了该访问过程的 Close()。我已经在代码之前添加了 sleep 来删除它。没什么用。
您知道如何在安装结束时将其删除吗?
谢谢,
【问题讨论】:
标签: c# .net installation
我正在通过 VS 2008 创建 MSI 安装程序。我尝试在安装结束时删除临时文件夹。该临时文件夹由我的安装程序创建,用于保存一些用于创建数据库的批处理文件。它总是显示其他进程正在访问它并且不允许我的代码删除它。我已经调用了该访问过程的 Close()。我已经在代码之前添加了 sleep 来删除它。没什么用。
您知道如何在安装结束时将其删除吗?
谢谢,
【问题讨论】:
标签: c# .net installation
当对文件夹调用 delete 时,您是否尝试过 Filemon 来查看谁在访问临时文件夹? 最好使用系统临时文件夹路径
System.Environment.GetEnvironmentVariable("TEMP")
您不必担心清理它。
【讨论】:
我可以考虑在临时文件夹中创建一个批处理文件以作为最后一步运行。您使用 ping (http://www.robvanderwoude.com/wait.php) 将其暂停,然后在几秒钟后(该安装程序已退出)使用传递的参数删除该文件夹:
PING 1.1.1.1 -n 1 -w 60000 >NUL
rd "%1"
这真的是一个黑客。最好根除锁定文件夹的内容。
【讨论】:
我将首先解决您设置中的概念问题:
首先,正如“Vinay B R”所说,确保您的“temp”文件夹位于 Windows %TEMP% 文件夹下。这样,如果您未能删除它们,您可以将文件保留在那里。
为什么要在完成后删除批处理文件?不希望您在 %TEMP% 文件夹内自行清理。
如果您想确保用户不再运行它们,那么您可以使用不同的文件扩展名(例如“.tmp”而不是 .bat)命名它们,使用此方法执行它们described here, 然后留下他们:
cmd < "%TEMP%foo.tmp"
如果您因为不希望用户访问文件而尝试删除文件,那么删除它们只会保护自己免受临时用户的侵害。
如果你还想删除文件,那么:
您自己的进程很可能正在锁定您的文件夹。使用 Process Explorer 可能会指向 msiexec.exe 或 cmd.exe。毫无疑问,一旦 MSI 和 SQL 退出,您就可以手动删除该文件夹,对吧?如果是这样,那么您自己的进程不会立即终止。找出为什么。 SQL 花费的时间是否比您想象的要长?
作为 Aliostad 方法的替代方法,这里列出了 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 -> Windows Installer 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
【讨论】: