【问题标题】:Localization of Special Folder Constants特殊文件夹常量的本地化
【发布时间】:2021-12-23 08:08:01
【问题描述】:

是否有人碰巧知道是否有完整的 Windows 10 本地化文件夹列表(例如 this one 仅适用于所有文件夹)? 我正在尝试创建一个自定义资源管理器,其中文件夹应以用户的母语显示。

我已经尝试使用ShellSpecialFolderConstants enumerationEnvironment.SpecialFolder enumeration 获取本地化文件夹的完整列表。 但仍有一些缺失(例如 C:/Users)。

SHGetFileInfo 不幸的是也不可能,因为否则性能会受到很大影响。

我曾想过简单地为其设计一个长选择语句,其中存储所有本地化文件夹。 如果已经有一个等价表,那么知道它当然会非常方便。

提前致谢!

【问题讨论】:

    标签: c# c++ windows directory explorer


    【解决方案1】:

    Microsoft 不提供列表,因为您不应该知道,您应该使用特殊/已知文件夹 API。这是为了防止人们对c:\Program files 等进行硬编码。在旧版本的Windows 中,磁盘上的文件夹通常是本地化的。在 Vista 中,这种情况发生了变化,现在真名是英文。

    如果您正在构建自定义资源管理器,那么您应该与 IShellFolder/IShellItem 打交道,他们可以提供显示名称。

    如果您在较低级别工作并忽略 shell 命名空间,您可以调用SHGetLocalizedName。此名称可以应用于任何文件夹,而不仅仅是特殊文件夹。

    如果您出于某种原因只关心特殊文件夹而不关心一般路径,IKnownFolder::GetFolderDefinition 声称返回一个包含本地化名称的结构。

    【讨论】:

    • 非常感谢您的详细解答。我将尝试使用IShellFolder::GetDisplayName 解决问题。我只是担心在调用一定数量的情况下,性能会受到太大影响。至少这个solution是这样的。
    • 这取决于你如何遍历文件夹树。如果您使用的是基于文件系统的 API,那么是的,它会像 SHGetFileInfo 一样慢。但是,如果您使用的是 IShellFolder 和朋友,那么您将处理 PIDL 并且它们会缓存一些数据。
    • 是的,我使用Directory.GetDirectories。有没有更快的穿越方式?特别是当我想检查返回的文件夹是否已本地化时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多