我正在通过VS 2008创建MSI安装程序。我尝试在安装结束时删除临时文件夹。该临时文件夹由我的安装程序创建,用于保存一些批处理文件以创建数据库。它始终显示其他进程正在访问它,并且不允许我的代码删除它。我已经调用了该访问过程的Close()。我在代码之前把睡眠删除了。没什么用的。
你知道如何在安装结束时删除它吗?
感谢,
答案 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