C# 是否可以在Windows资源管理器中打开文件.Delete?
我有一个非常奇怪的问题,在我的应用程序的某一点上,Windows资源管理器似乎只是自己打开一个文件夹 如果我单步执行visual studio调试器,则不会发生这种情况,但通过策略性地设置断点,它似乎发生在C# 是否可以在Windows资源管理器中打开文件.Delete?,c#,visual-studio,explorer,C#,Visual Studio,Explorer,我有一个非常奇怪的问题,在我的应用程序的某一点上,Windows资源管理器似乎只是自己打开一个文件夹 如果我单步执行visual studio调试器,则不会发生这种情况,但通过策略性地设置断点,它似乎发生在文件.Delete行的此区域中。我是通过在行前设置一个中断(不会发生)并在行后再次尝试设置中断(会发生)来实现的 strIniPath的值为C:\pdf995\res,但打开的目录为C:\pdf995\res\convert 当我删除上面的代码时,它就停止了,但是如果我把代码放回去,它就不会再
文件.Delete
行的此区域中。我是通过在行前设置一个中断(不会发生)并在行后再次尝试设置中断(会发生)来实现的
strIniPath
的值为C:\pdf995\res
,但打开的目录为C:\pdf995\res\convert
当我删除上面的代码时,它就停止了,但是如果我把代码放回去,它就不会再发生了!(我必须卸载并重新安装应用程序,使其再次启动)。上面的代码在执行时从两个不同的位置调用,间隔约1-2秒,这发生在第二次运行时
我也可以通过在代码中加入一些线程.Sleep
行来防止它,但是我并不真正希望这是一个解决方案,因为它没有找到问题的根源,而且效率也很低(延迟必须大约半秒或更长)
请注意,在两个调用之间会生成一个PDF995报告(这就是导致现有延迟的原因),因此,了解该应用程序的人是否可以提供一些信息?也许删除ini文件会导致PDF995出于某种原因打开此文件夹
或者,是否有一种方法可以获取导致应用程序在Windows本身或Visual Studio中启动的相关信息
编辑
以下是RetrieveIniPath()
中的代码。它没有点击catch
部分
public static string RetrieveIniPath()
{
string strPdf995IniPath = "";
try
{
string regPath = Consts.PDF995_PATH;
RegistryKey regKey = null;
regKey = Registry.LocalMachine.OpenSubKey(regPath);
strPdf995IniPath = (String)regKey.GetValue("UninstallString", string.Empty);
if (strPdf995IniPath.Contains("setup.exe"))
{
strPdf995IniPath = strPdf995IniPath.Substring(0, strPdf995IniPath.IndexOf("setup.exe")) + "res\\";
}
else
{
strPdf995IniPath = (String)regKey.GetValue("DisplayIcon", string.Empty);
if (strPdf995IniPath.Length > 10)
{
strPdf995IniPath = strPdf995IniPath.Substring(0, strPdf995IniPath.Length - 9) + "res\\";
}
else
{
strPdf995IniPath = @"c:\pdf995\res\";
}
}
regKey.Close();
}
catch (Exception ex)
{
LogManager.Instance().LogError(ex.Message, true);
}
if (strPdf995IniPath.Length == 0)
{
strPdf995IniPath = @"c:\pdf995\res\";
}
return strPdf995IniPath;
}
我已经得出结论,是PDF995模块本身(
pdfsave
process)打开文件夹以响应其ini文件被删除。如果文件被覆盖,它也会执行此操作,因此将移动
更改为复制
(使用覆盖)没有帮助。当应用程序的执行到达文件时,进程尚未完全关闭。请删除
我的解决方案就是在替换文件之前等待进程退出
while (true)
{
Process[] pdfProcess = Process.GetProcessesByName("pdfsave");
if (pdfProcess.Length == 0)
{
break;
}
Thread.Sleep(50);
}
if (File.Exists(strIniPath + "pdf995.ini"))
{
File.Delete(strIniPath + "pdf995.ini");
}
File.Move(strIniPath + "pdf995.ini_backup", strIniPath + "pdf995.ini");
为什么删除,然后恢复代码导致它停止发生仍然是一个谜 可能您有另一个线程更改了strIniPath
。在删除之前,能否在运行时添加带有strIniPath
的日志?@ygabel-strIniPath
是此方法中的局部变量(我更新了问题以进行说明),在任何情况下,我都通过watches和Console.WriteLines检查了它的值,它确实具有我假设的值(C:\pdf995\res
)File.Delete
不会打开任何内容。它与shell和资源管理器没有任何关系。就这样。您是否使用过程。在代码中的任何位置启动?如果您将文件夹路径作为可执行文件传递,则资源管理器将打开文件夹,但您所说的不会在调试中重现。这将有助于您在不停止代码时查看值。@Ygalbel-它确实发生在调试中,但在我进入调试时不会发生。此外,正如我在评论中所说,我使用了Console.WriteLine
,它给出了相同的值。
while (true)
{
Process[] pdfProcess = Process.GetProcessesByName("pdfsave");
if (pdfProcess.Length == 0)
{
break;
}
Thread.Sleep(50);
}
if (File.Exists(strIniPath + "pdf995.ini"))
{
File.Delete(strIniPath + "pdf995.ini");
}
File.Move(strIniPath + "pdf995.ini_backup", strIniPath + "pdf995.ini");