C# 是否可以在Windows资源管理器中打开文件.Delete?

C# 是否可以在Windows资源管理器中打开文件.Delete?,c#,visual-studio,explorer,C#,Visual Studio,Explorer,我有一个非常奇怪的问题,在我的应用程序的某一点上,Windows资源管理器似乎只是自己打开一个文件夹 如果我单步执行visual studio调试器,则不会发生这种情况,但通过策略性地设置断点,它似乎发生在文件.Delete行的此区域中。我是通过在行前设置一个中断(不会发生)并在行后再次尝试设置中断(会发生)来实现的 strIniPath的值为C:\pdf995\res,但打开的目录为C:\pdf995\res\convert 当我删除上面的代码时,它就停止了,但是如果我把代码放回去,它就不会再

我有一个非常奇怪的问题,在我的应用程序的某一点上,Windows资源管理器似乎只是自己打开一个文件夹

如果我单步执行visual studio调试器,则不会发生这种情况,但通过策略性地设置断点,它似乎发生在
文件.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");