【问题标题】:Display custom header or column in Windows Explorer在 Windows 资源管理器中显示自定义标题或列
【发布时间】:2012-03-10 16:55:41
【问题描述】:

我的应用程序向文件添加了一些自定义元数据。我想像这样在 Windows 资源管理器中显示它:

或者这个:

有没有办法在 .NET 中做到这一点?

【问题讨论】:

  • 请问您使用什么方法添加自定义元数据?您是否使用了备用数据流,或者只是将数据存储在隐藏文件中,或者其他什么地方?感谢您提供任何信息!
  • @amt528 我最终没有追求这个项目。我尝试了一些可能有效的方法,但 7 年后我真的不记得了。
  • 我认为这与 NTFS 文件元数据有关。复制到不同的文件系统会破坏元数据。
  • 您知道如果您使用 Windows 属性系统,它是否会遭到攻击? docs.microsoft.com/en-us/windows/desktop/properties/…
  • @amt528 我认为它不应该被核爆,但最好的方法是测试它。将带有元数据的文件移动到格式化为 FAT32 的闪存驱动器,然后查看元数据是否存在。在这种情况下,我不知道元数据的确切存储位置。也许当您将闪存驱动器插入另一台计算机时,它不会有元数据。

标签: c# .net windows shell-extensions


【解决方案1】:

在 Windows 文件管理器中构建自定义列有两种方法:使用 Windows 属性系统和云存储提供程序的属性定义。您通常会使用第一种方法为您拥有的文件类型创建自定义属性。在显示来自文档管理系统或任何其他存储的自定义数据时,您将使用第二种方法。

使用 Windows 属性系统。

对于 Windows Vista 及更高版本中的特定文件类型,您可以create custom properties。这些属性可以是只读的或读写的。以及它们可以被 Window Search 索引器索引并参与搜索。有一些限制:

...属性处理程序不能在托管代码中实现,应该是 用 C++ 实现。

  • 该属性与通常属于您的应用程序的特定文件类型相关联。您不能为所有文件类型创建属性。

使用云存储提供商属性定义

在 Windows 10 Creators Update 及更高版本中,您可以为使用 Cloud Sync Engine API(存储提供程序、云过滤器 API)创建的文件系统添加自定义列。此 API 用于 OneDrive 等工具。您需要使用自定义属性定义注册 Cloud Storage Provider 同步根,为您的自定义列提供数据,最后使用 Cloud File/Cloud Filter API 实现 Cloud Storage 提供程序。

属性定义与文件类型无关,可以为所有文件添加。此外,即使 .NET 中只有一些 API 可用,您仍然可以调用 Win32 函数并仅使用托管代码构建云提供商。

注册云存储提供程序。以下是使用 C# 自定义列注册存储提供程序的示例:

StorageProviderSyncRootInfo storageInfo = new StorageProviderSyncRootInfo();
storageInfo.Path = await StorageFolder.GetFolderFromPathAsync("C:\\Users\\User1\\VFS\\");
...
        
// Adds columns to Windows File Manager. 
// Show/hide columns in the "More..." context menu on the columns header.
var proDefinitions = storageInfo.StorageProviderItemPropertyDefinitions;
proDefinitions.Add(new StorageProviderItemPropertyDefinition { DisplayNameResource = "Lock Expires", Id = 2, });
proDefinitions.Add(new StorageProviderItemPropertyDefinition { DisplayNameResource = "Lock Scope", Id = 3, });
        
StorageProviderSyncRootManager.Register(storageInfo);

可以在here找到完整的注册示例。

为属性定义提供数据。要为列提供数据,您将使用 StorageProviderItemProperties.SetAsync() 调用:

IStorageItem storageItem = await Windows.Storage.StorageFile.GetFileFromPathAsync(path);
StorageProviderItemProperty propState = new StorageProviderItemProperty()
{
     Id = 3,
     Value = "Exclusive",
     IconResource = "C:\\path\\icon.ico" // The optional icon to be displayed in the Status column.
};
await StorageProviderItemProperties.SetAsync(storageItem, new StorageProviderItemProperty[] { propState });

另一种方法是实现IStorageProviderItemPropertySource 接口。它会根据您的文件路径返回属性。

Cloud Storage Provider 实施。 最后,您需要一个完整的文件系统实施,为您的文件/文件夹占位符提供数据。您可以在 .NET/C# here 中找到完整的示例:

【讨论】:

  • 当您说“您拥有的文件类型”时,这是否等同于说此工作流程中的以下字段:右键单击文件 > 属性 > 常规选项卡 > 带有前缀“打开方式”的值字段和旁边的“更改”按钮?
  • @MacGyver。不,这意味着您不能为 .exe 或 .docx 文件创建自定义列。但是您可以为自己的自定义文件类型创建自定义列,由您的应用程序管理。
  • 我想我找到了,右键单击文件>单击右键菜单中的“属性”>单击“安全”选项卡>单击“高级”按钮>查看“所有者”字段
【解决方案2】:

请注意:此答案仅适用于 XP 和 Vista,已过时

可以在 XP 上使用 Column Handler shell 扩展来完成 - 请参见此处: http://www.codeproject.com/Articles/3747/Explorer-column-handler-shell-extension-in-C#

但是,Vista 及更高版本不支持 IColumnHandler。在这里你必须实现PropertyHandler。请参阅 Windows SDK \Samples\winui\Shell\AppShellIntegration\PropertyHandlers

每个属性都由属性架构 XML 文件描述。此属性架构必须使用PSRegisterPropertySchema() 注册。属性处理程序实现IInitializeWithXXXIPropertyStore 和可选的IPropertyStoreCapabilities。您必须为您要处理的每个文件扩展名注册CLSID

很遗憾,您不能在注册时使用AllFileSystemObject*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2011-01-25
    相关资源
    最近更新 更多