Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Windows资源管理器中显示自定义标题或列_C#_.net_Windows_Shell Extensions - Fatal编程技术网

C# 在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

我的应用程序将一些自定义元数据添加到文件中。我想在Windows资源管理器中显示它,如下所示:

或者这个:


在.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中:
…属性处理程序不能在托管代码中实现,应 用C++实现.< /P>
  • 该属性绑定到特定的文件类型,该文件类型通常属于您的应用程序。不能为所有文件类型创建属性
使用云存储提供程序属性定义 在Windows 10 Creators Update和更高版本中,您可以为使用(存储提供程序、云过滤器API)创建的文件系统添加自定义列。此API用于OneDrive等工具中。您需要使用自定义属性定义注册云存储提供程序同步根,为自定义列提供数据,最后使用云文件/云过滤器API实现云存储提供程序。

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

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

可以找到完整的注册示例

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

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


云存储提供商实施。最后,您需要一个完整的文件系统实施,为您的文件/文件夹占位符提供数据。您可以在.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 });