You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测指定文件夹是否已在Windows Explorer中打开?

检测Windows资源管理器是否打开指定文件夹的可行方案

当然有靠谱的实现方案!我之前做工具的时候刚好遇到过类似需求,整理了两种实用的思路,你可以根据自己的开发场景选:

方法一:利用Windows Shell API(以C#为例)

Windows的Shell组件提供了ShellWindows对象,能枚举所有打开的资源管理器窗口,我们可以通过它获取每个窗口的当前路径,再和目标文件夹对比。

步骤大概是这样:

  1. 引用SHDocVw COM组件(或者通过COM互操作手动导入)
  2. 遍历ShellWindows集合里的每个窗口
  3. 提取窗口的LocationURL,转换为本地文件路径格式
  4. 和目标文件夹的绝对路径做对比(注意路径的大小写不敏感,以及斜杠转换)

示例代码:

using SHDocVw;
using System;
using System.IO;

public static bool IsFolderOpenInExplorer(string targetFolder)
{
    // 转换为标准绝对路径,统一格式
    string targetPath = Path.GetFullPath(targetFolder).TrimEnd(Path.DirectorySeparatorChar);
    bool isOpen = false;

    ShellWindows shellWindows = new ShellWindows();
    foreach (InternetExplorer window in shellWindows)
    {
        // 过滤掉非资源管理器窗口(比如IE窗口)
        if (Path.GetFileNameWithoutExtension(window.FullName).Equals("explorer", StringComparison.OrdinalIgnoreCase))
        {
            // 把LocationURL转成本地路径
            string currentPath = window.LocationURL.Replace("file:///", "").Replace('/', '\\');
            // 解码URL编码的字符(比如空格会变成%20)
            currentPath = Uri.UnescapeDataString(currentPath).TrimEnd(Path.DirectorySeparatorChar);
            
            if (currentPath.Equals(targetPath, StringComparison.OrdinalIgnoreCase))
            {
                isOpen = true;
                break;
            }
        }
    }

    // 释放COM对象,避免内存泄漏
    System.Runtime.InteropServices.Marshal.ReleaseComObject(shellWindows);
    return isOpen;
}

注意事项:

  • 需要在项目里添加对Microsoft Internet Controls(即SHDocVw.dll)的引用
  • 处理特殊路径(比如库、网络共享文件夹)时,可能需要额外的逻辑转换路径格式
  • Windows 11的资源管理器有些UI变化,但核心API逻辑还是通用的

方法二:用PowerShell脚本快速实现

如果你的场景不需要编译成应用,用PowerShell脚本就能快速搞定,原理和上面的API方法类似,只是用脚本语言调用Shell组件:

示例脚本:

function Test-FolderOpenInExplorer {
    param(
        [string]$TargetFolder
    )

    $targetPath = (Resolve-Path $TargetFolder).Path.TrimEnd('\')
    $shell = New-Object -ComObject Shell.Application
    $windows = $shell.Windows()

    foreach ($window in $windows) {
        if ($window.FullName -match "explorer.exe") {
            $currentPath = $window.LocationURL -replace 'file:///', '' -replace '/', '\'
            $currentPath = [Uri]::UnescapeDataString($currentPath).TrimEnd('\')
            if ($currentPath -eq $targetPath) {
                return $true
            }
        }
    }
    return $false
}

# 调用示例:检测D:\Test是否打开
Test-FolderOpenInExplorer -TargetFolder "D:\Test"

这个脚本可以直接在PowerShell里运行,或者嵌入到你的自动化工作流中。

额外小提示

  • 两种方法都需要注意路径的一致性:比如目标文件夹是D:\Test,而资源管理器显示的是D:\Test\(末尾带斜杠),所以对比前要统一去掉末尾的分隔符
  • 如果需要激活已打开的窗口,拿到对应的窗口对象后,可以调用window.Visible = true和window.Activate()方法(C#里)
  • 对于网络共享文件夹,LocationURL会是file://server/share格式,转换时要注意保留服务器名部分

内容的提问来源于stack exchange,提问作者Gavin Craft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:53:47