如何在 C# 中浏览本地虚拟文件夹?

2023-11-22

在我的 C# 程序中,我必须浏览目录。 所以我使用的方法System.IO.Directory.GetFiles(directory)当目录是像“C:\Program File”这样的真实目录时,它工作得很好,但是当它是虚拟目录(例如:librairie目录)时,目录值看起来像这样:“::{031E4825-7B94-4dc3-B131-E946B44C8DD5 }\Pictures.library-ms”,我不知道如何浏览它。


我知道这太老了,但如果有人想要解决方案,这是我在过去半天的研究中发现的。有几种解决方案可以帮助您文件夹名称(如果您为其指定虚拟文件夹的 XML 位置的路径),但我没有看到任何东西可以让你到达那里::{031E4825-....}。有一个暗示另一个问题的答案使用 WindowsAPICodePack 的 KnownFoldersBrowser 示例。所以我通读了其中的源代码并得出以下结论:

这是我用来获取文件夹的对话框,我已为AllowNonFileSystemItems启用它,它允许选择库文件夹:

Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog dlg = new Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog();
dlg.Title = "Pick Folder";
dlg.IsFolderPicker = true;
dlg.InitialDirectory = Environment.SpecialFolder.Personal.ToString();  // If default setting does not exist, pick the Personal folder

dlg.AddToMostRecentlyUsedList = false;
dlg.AllowNonFileSystemItems = true;
dlg.DefaultDirectory = dlg.InitialDirectory;
dlg.EnsurePathExists = true;
dlg.EnsureFileExists = false;
dlg.EnsureReadOnly = false;
dlg.EnsureValidNames = true;
dlg.Multiselect = true;
dlg.ShowPlacesList = true;

if (dlg.ShowDialog() == Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialogResult.Ok)
{
    foreach ( string dirname in dlg.FileNames )
    {
        var libFolders = ExpandFolderPath(dirname);
        if ( libFolders == null )
        {
            MessageBox.Show("Could not add '" + dirname + "', please try another.");
        }
        else
        {
            foreach ( string libfolder in libFolders )
            {
                DoWork(libfolder);
            }
        }
    }
}

然后我迭代allSpecialFolders找到这个相同的::{031E4825-...}这是 SpecialFolder 的 ParsingName(是的,可能是一种更优雅的方式)。之后,使用从其他解决方案读取的XML(我使用了一个 CodeProject 示例,它做了同样的事情) 获取该库文件夹中的文件夹:

    /// <summary>Gets the folders associated with a path</summary>
    /// <param name="libname"></param>
    /// <returns>Folder, or List of folders in library, and null if there was an issue</string></returns>
    public List<string> ExpandFolderPath(string foldername)
    {
        List<string> dirList = new List<string> { };
        // If the foldername is an existing directory, just return that
        if ( System.IO.Directory.Exists(foldername) )
        {
            dirList.Add(foldername);
            return dirList;
        }

        // It's not a directory, so check if it's a GUID Library folder
        ICollection<IKnownFolder> allSpecialFolders = Microsoft.WindowsAPICodePack.Shell.KnownFolders.All;
        Regex libguid = new Regex(@"\b([A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12})\b");
        var match = libguid.Match(foldername);
        if ( match == null )
            return null;

        string fpath = "";
        // Iterate over each folder and find the one we want
        foreach ( var folder in allSpecialFolders )
        {
            if ( folder.ParsingName == foldername )
            {
                // We now have access to the xml path
                fpath = folder.Path;
                break;
            }
        }
        if ( fpath == "" )
        {
            // Could not find it exactly, so find one with the same prefix, and
            // replace the filename
            foreach ( var folder in allSpecialFolders )
            {
                if ( folder.ParsingName.Contains(match.Groups[1].Value) )
                {
                    string sameDir = System.IO.Path.GetDirectoryName(folder.Path);
                    string newPath = System.IO.Path.Combine(sameDir, match.Groups[2].Value);
                    if ( System.IO.File.Exists(newPath) )
                        fpath = newPath;
                    break;
                }
            }
        }

        if ( fpath == "" )
            return null;

        var intFolders = GetLibraryInternalFolders(fpath);

        return intFolders.Folders.ToList();

    }


    /// <summary>
    /// Represents an instance of a Windows 7 Library
    /// </summary>
    public class Win7Library
    {
        public Win7Library()
        {

        }

        public string Name { get; set; }

        public string[] Folders { get; set; }
    }

    [DllImport("shell32.dll")]
    static extern int SHGetKnownFolderPath( [MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath );

    //Handles call to SHGetKnownFolderPath
    public static string getpathKnown( Guid rfid )
    {
        IntPtr pPath;
        if ( SHGetKnownFolderPath(rfid, 0, IntPtr.Zero, out pPath) == 0 )
        {
            string s = System.Runtime.InteropServices.Marshal.PtrToStringUni(pPath);
            System.Runtime.InteropServices.Marshal.FreeCoTaskMem(pPath);

            return s;
        }
        else return string.Empty;
    }

    private static string ResolveStandardKnownFolders( string knowID )
    {
        if ( knowID.StartsWith("knownfolder:") )
        {
            return getpathKnown(new Guid(knowID.Substring(12)));
        }
        else
        {
            return knowID;
        }
    }

    private static Win7Library GetLibraryInternalFolders( string libraryXmlPath )
    {
        Win7Library newLibrary = new Win7Library();
        //The Name of a Library is just its file name without the extension
        newLibrary.Name = System.IO.Path.GetFileNameWithoutExtension(libraryXmlPath);

        List<string> folderpaths = new List<string>();

        System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); //* create an xml document object.
        xmlDoc.Load(libraryXmlPath); //* load the library as an xml doc.

        //Grab all the URL tags in the document, 
        //these point toward the folders contained in the library.
        System.Xml.XmlNodeList directories = xmlDoc.GetElementsByTagName("url");

        foreach ( System.Xml.XmlNode x in directories )
        {
            //Special folders use windows7 Know folders GUIDs instead 
            //of full file paths, so we have to resolve them
            folderpaths.Add(ResolveStandardKnownFolders(x.InnerText));
        }

        newLibrary.Folders = folderpaths.ToArray();
        return newLibrary;
    }

希望这对将来的人有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C# 中浏览本地虚拟文件夹? 的相关文章

  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • Caliburn.Micro - ShowDialog() 如何关闭对话框?

    EDIT 新信息 刚刚设法让记录器工作 老实说 我不知道 cm 有一个 并且在尝试使用时收到此消息TryClose TryClose requires a parent IConductor or a view with a Close m
  • 生成多个随机数

    我想生成 25 个唯一的随机数并将它们列在控制台中 数字的长度应至少为 10 个字符 有什么简单的方法可以做到这一点吗 尝试将数字构建为字符串 并使用 HashSet 确保它们是唯一的 Random random new Random Ha
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • 应用程序处于中断模式。您的应用程序已进入中断状态,

    我发现自己遇到了同样的问题here https stackoverflow com questions 36204009 disable break mode page in vs2015 我在 dll 中使用 Windows 窗体 这是针
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • 在 C# 中使用命名空间别名有什么好处? [复制]

    这个问题在这里已经有答案了 使用命名空间别名有什么好处 仅仅是为了简化编码吗 仅当与类发生冲突时我才使用名称空间别名 对我来说 这根本没有简化 我的意见是 如果没有必要 就不要使用
  • 使用数据绑定,如何将包含表情符号的文本绑定到标签并使其正确显示?

    我正在编写一个应用程序来连接 WordPress BuddyPress API 该应用程序将允许用户通过 API 相互发送消息 当这些消息包含表情符号时 我很难正确显示它们 以下是 API 返回的消息文本的简短示例 Hi x1f642 ho
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • Gremlin.net 文本包含等效项

    我正在使用 Gremlin net 库连接到 janus 图形服务器 我使用 cassandra 和弹性搜索进行数据存储和索引 在我使用的 gremlin 语言和 gremlin 控制台中文本包含在属性的文本中进行搜索 我正在使用混合索引
  • 如何同步nosql db(ravendb)中的更改

    我已经开始在 RavenDB 的示例上学习 NoSQL 我从一个最简单的模型开始 假设我们有由用户创建的主题 public class Topic public string Id get protected set public stri
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 如何检测应用程序正在运行的 .NET 版本?

    我尝试使用Environment Version ToString 确定目标计算机上正在使用什么 NET 框架 但安装了 4 0 版本时 它说我正在使用 NET 2 0 如何检测目标计算机上正在运行的 NET Framework 版本 En
  • C 变量声明的效率 [重复]

    这个问题在这里已经有答案了 例如 在 C 中声明一个变量需要多长时间int x or unsigned long long var 我想知道它是否会让我的代码在类似的事情中更快 for conditions int var 0 code 这
  • 使用多态对象数组进行 JSON 反序列化

    我在涉及多态对象数组的 JSON 反序列化方面遇到问题 我已经尝试过记录的序列化解决方案here https stackoverflow com questions 5186973 json serialization of array w
  • Boost.asio和异步链,unique_ptr?

    我对异步编程不太熟悉 我有一个问题 我的问题如下 给出 boost asio 中 C 11 的 echo server 示例 http www boost org doc libs 1 60 0 doc html boost asio ex
  • 使用 CodeDOM 将程序集添加到 BuildManager 会导致间歇性错误

    我正在使用 CodeDOM 在运行时创建内存中程序集 如下所示 public Assembly Compile CodeCompileUnit targetUnit string path Path GetDirectoryName new
  • 将一个 IEnumerable 拆分为多个 IEnumerable

    我是 linq 新手 我需要根据指示器将 Couple string text bool Indicator 类型的 IEnumerable 拆分为多个 IEnumerable 我尝试使用skipWhile 和 TakeWhile 但没有找

随机推荐

  • 访问iOS6 UIPageViewController创建的UIPageControl?

    我正在使用一个UIPageViewController导航设置为水平 过渡样式设置为滚动 在 InterfaceBuilder 中 并且没有脊柱 这给了我一个可爱的 UIPageControl 集成 现在我希望能够切换它是否显示 因为它下面
  • 在一组固定元素上生成特定秩的“随机”矩阵

    我想生成大小的矩阵mxn和排名r 元素来自指定的有限集 例如 0 1 or 1 2 3 4 5 我希望它们在某种非常宽松的意义上是 随机 的 即我想从算法中获得各种可能的输出 其分布与具有指定等级的元素集上的所有矩阵的分布大致相似 事实上
  • 未知软件异常0xe0434352

    While I am trying to launch my application I am getting the following error 检查了应用程序日志 但没有错误消息 这是由于任何框架版本或任何其他依赖关系吗 这是 CL
  • TPL DataFlow 与 BlockingCollection

    我明白 一个BlockingCollection最适合消费者 生产者模式 但是 我什么时候使用ActionBlock来自TPL数据流图书馆 我最初的理解是对于IO操作 保留BlockingCollection而 CPU 密集型操作最适合Ac
  • 删除前 16 个字节?

    我将如何从字节数组中删除多个字节 编辑 正如 nobugz 的评论 和 Reed Copsey 的答案 提到的 如果您实际上不需要结果作为字节数组 您应该考虑使用ArraySegment
  • 具有正确重力和单行的提示和文本视图

    我打开了一个错误 但我想知道是否有人遇到此问题并知道解决方法 如果您定义一个带有提示的文本视图 请给它正确的重力 android gravity right 然后如果您定义android singleLine true或android ma
  • 在 PyQtGraph 中返回鼠标光标坐标

    我是 PyQtGraph 的新手 想用它来快速可视化我的数据采集 以前我使用 matplotlib 其中重绘图形是我的瓶颈 转换到 PyQtGraph 后 我目前只缺少 matplotlib 的一项功能 即 返回鼠标光标的 x 坐标和 y
  • ASP.NET MVC 中的模拟

    我在内联网上有一个 MVC Web 应用程序 并且希望能够在我们的 FTP 服务器上创建文件以发送给外部合作伙伴 模拟代码使用 WindowsImpersonationContext System Security Principal Wi
  • vim:搜索替换所有可写缓冲区

    so 1GvG s g 可以替换整个缓冲区 但是 假设我加载了多个 vim 缓冲区 并且我想对所有可写的缓冲区执行 s 操作 有没有办法在 vim 中做到这一点 由于我无法发表评论 因此我将重复 Brian 所说的话并添加我的 2 美分 我
  • Nodejs以数组格式追加到json文件中

    我希望nodejs按以下格式附加JSON格式的所有数据 name admin message dfd datetime 2014 06 03 13 01 39 name admin message dfd datetime 2014 06
  • Google 地图 V3 圆圈与我创建的圆圈不匹配

    我使用 Google Maps V3 API 创建了一个圆圈 并尝试制作一个具有相同半径的标记圆圈 Problem 我创建的是倾斜的 而谷歌地图创建的是一个漂亮的圆形 什么地方出了错 谷歌地图 V3 圆码 Draw search circl
  • 在R中,使用gridBase在图中嵌入子图时如何防止pdf中的空白页

    正如所解释的here 很容易将绘图嵌入到现有绘图中 这要归功于gridBase 尽管两个图都使用 R 的基本图形系统 但是 将整个图保存为 pdf 时 第一页始终为空白 如何防止这种情况发生 这是一个例子 require gridBase
  • wix 服务依赖

    我的产品有多种功能 其中包括两项服务 我们将它们称为 ServiceA 和 ServiceB 这两个服务功能都是可选的 但是 如果在安装过程中同时选择了 ServiceA 和 ServiceB 我想在它们之间创建服务依赖关系 以便 Serv
  • 无法创建 AVD 确定已禁用

    我已经安装了 eclipse juno 4 2 1 Android SDK 我创建了一个 Android 应用程序 同时创建了新的 AVD 这Ok尽管我已经确定了它的所有规格 但按钮始终处于禁用状态 这是我输入的规格 我不知道为什么 有任何
  • 代码中的 ASP.NET Core appsettings.json 更新

    我目前正在使用 asp net core v1 1 进行项目 在我的 appsettings json 中我有 AppSettings AzureConnectionKey AzureContainerName NumberOfTicks
  • 正则表达式的复杂度是多少?

    对字符串执行正则表达式比较所需的字符串长度的复杂性是多少 答案取决于 正则表达式 的确切含义 经典的正则表达式可以是compiled into 确定性有限自动机可以匹配长度的字符串N in O N 时间 正则表达式语言的某些扩展使情况变得更
  • 核心数据和保留周期

    我有一个核心数据类 Game 它与另一个类 Player 具有一对多关系 这就是他们的标题的样子 property nonatomic retain NSSet players In Game h property nonatomic re
  • 集合中的插入顺序(解析 {} 时)[重复]

    这个问题在这里已经有答案了 有人问here为什么放的时候1 and True in a set only 1保持 这当然是因为1 True 但在哪些情况下1被保留 在什么情况下True保持 让我们来看看 通过一个list建立set而不是使用
  • 在 ASP.NET 中的开发/UAT/产品环境之间切换配置的最佳方法?

    开发 Web 应用程序时 我需要在 3 个不同的环境之间切换 开发 UAT 和产品 我的配置文件中的所有 3 个数据库连接都有不同的数据库连接 我已经看到通过更改所有引用然后重建解决方案手动完成这些设置的切换 并且还使用预处理器指令完成 有
  • 如何在 C# 中浏览本地虚拟文件夹?

    在我的 C 程序中 我必须浏览目录 所以我使用的方法System IO Directory GetFiles directory 当目录是像 C Program File 这样的真实目录时 它工作得很好 但是当它是虚拟目录 例如 libra