C# 在Windows资源管理器中显示自定义标题或列
我的应用程序将一些自定义元数据添加到文件中。我想在Windows资源管理器中显示它,如下所示: 或者这个:C# 在Windows资源管理器中显示自定义标题或列,c#,.net,windows,shell-extensions,C#,.net,Windows,Shell Extensions,我的应用程序将一些自定义元数据添加到文件中。我想在Windows资源管理器中显示它,如下所示: 或者这个: 在.NET中有什么方法可以做到这一点吗?请注意:这个答案只适用于XP和VISTA,它已经过时了 可以使用列处理程序外壳扩展在XP上完成此操作-请参见此处: 但是,Vista及以上版本不支持IColumnHandler。这里您必须实现属性handler。请参阅Windows SDK\Samples\winui\Shell\AppShellIntegration\PropertyHand
在.NET中有什么方法可以做到这一点吗?请注意:这个答案只适用于XP和VISTA,它已经过时了 可以使用列处理程序外壳扩展在XP上完成此操作-请参见此处: 但是,Vista及以上版本不支持
IColumnHandler
。这里您必须实现属性handler
。请参阅Windows SDK\Samples\winui\Shell\AppShellIntegration\PropertyHandler
每个属性都由属性模式XML文件描述。此属性架构必须注册到PSRegisterPropertySchema()
。属性处理程序实现了IInitializeWithXXX
,IPropertyStore
和可选的IPropertyStoreCapabilities
。您必须为要处理的每个文件扩展名注册实现的CLSID
不幸的是,您不能在注册中使用
所有FileSystemObject
或*
。在Windows文件管理器中构建自定义列有两种方法:使用Windows属性系统和云存储提供器的属性定义。通常,您将使用第一种方法为您拥有的文件类型创建自定义属性。当显示来自文档管理系统或任何其他存储的自定义数据时,将使用第二种方法
使用Windows属性系统。
在Windows Vista和更高版本中,您可以为特定的文件类型选择。这些属性可以是只读或读写。此外,它们还可以被窗口搜索索引器索引并参与搜索。有一些限制:
- 微软明确表示,它不能在.NET中:
- 该属性绑定到特定的文件类型,该文件类型通常属于您的应用程序。不能为所有文件类型创建属性
云存储提供商实施。最后,您需要一个完整的文件系统实施,为您的文件/文件夹占位符提供数据。您可以在.NET/C#中找到完整的示例:对不起,请编辑我的答案以添加有关Vista和Win7的信息。同时还要考虑这些信息:让我知道这一条是否适合您:在托管代码中编写shell扩展通常不是一个好主意。这里可以看到,我会尝试找到一些旧的代码,并把它放在这里。一个代码框架:有一些用C++编写的shell扩展对象的例子,在.net 4中,至少应该给你指针,直到找到我自己的样本(不是100%个我仍然有)。我可以问一下您使用了什么方法来添加自定义元数据吗?您是否使用了备用数据流,或者只是将数据存储在隐藏文件中,或者其他什么?谢谢你提供的任何信息@amt528我最终并没有追求这个项目。我尝试了一些可能有效的方法,但7年后我不记得了。我认为这与NTFS文件元数据有关。复制到其他文件系统会破坏元数据。您知道如果使用Windows属性系统,元数据是否会被破坏@amt528我认为不应该使用核武器,但最好的方法是测试它。将包含元数据的文件移动到FAT32格式的闪存驱动器中,然后查看元数据是否存在。我不知道在这种情况下元数据存储在哪里。当你在另一台计算机上插入该闪存驱动器时,它可能没有元数据。当你说“你拥有的文件类型”时,这是否等同于在该工作流中说以下字段:右键单击文件>属性>常规选项卡>值字段,其前文本为“打开方式”,旁边有一个“更改”按钮?@MacGyver。不,这意味着您不能为.exe或.docx文件创建自定义列。但您可以为自己的自定义文件类型创建自定义列,该文件类型由您的应用程序管理。我想我找到了它,右键单击文件>右键单击菜单中的“属性>单击“安全”选项卡>单击“高级”按钮>查看“所有者”字段
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);
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 });