13

私のアプリは、いくつかのカスタムメタデータをファイルに追加します。このようにWindowsエクスプローラーで表示したい:

モックアップ1

またはこれ:

モックアップ2

.NETでこれを行う方法はありますか?

4

2 に答える 2

13

Windowsファイルマネージャーでカスタム列を作成するには、Windowsプロパティシステムとクラウドストレージプロバイダーのプロパティ定義を使用するという2つのアプローチがあります。通常、最初のアプローチを使用して、所有するファイルタイプのカスタムプロパティを作成します。ドキュメント管理システムまたはその他のストレージからカスタムデータを表示する場合は、2番目のアプローチを使用します。

Windowsプロパティシステムの使用。

Windows Vista以降のバージョンでは、特定のファイルタイプのカスタムプロパティを作成できます。これらのプロパティは、読み取り専用または読み取り/書き込みにすることができます。また、ウィンドウサーチインデクサーでインデックスを作成して検索に参加することもできます。いくつかの制限があります:

...プロパティハンドラーはマネージコードで実装できないため、C++で実装する必要があります。

  • プロパティは、通常はアプリケーションに属する特定のファイルタイプに関連付けられています。すべてのファイルタイプのプロパティを作成できるわけではありません。

クラウドストレージプロバイダーのプロパティ定義の使用

Windows 10 Creators Update以降では、 Cloud Sync Engine API(ストレージプロバイダー、Cloud Filter API)を使用して作成されたファイルシステムのカスタム列を追加できます。このAPIは、OneDriveなどのツールで使用されます。クラウドストレージプロバイダーの同期ルートをカスタムプロパティ定義に登録し、カスタム列にデータを提供し、最後にクラウドファイル/クラウドフィルターAPIを使用してクラウドストレージプロバイダーを実装する必要があります。 ここに画像の説明を入力してください

プロパティ定義はファイルタイプに関連付けられておらず、すべてのファイルに追加できます。また、.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);

完全な登録例はここにあります。

プロパティ定義のデータを提供します。列のデータを提供するには、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インターフェイスを実装することです。ファイルパスに基づいてプロパティを返します。

クラウドストレージプロバイダーの実装。最後に、ファイル/フォルダーのプレースホルダーにデータを提供する、完全なファイルシステムの実装が必要になります。完全な例は、ここの.NET / C#にあります。

于 2021-02-02T21:20:43.207 に答える
4

注意してください:この回答はXPおよびVISTAのみを対象としており、古くなっています。

これは、列ハンドラーシェル拡張機能を使用してXPで実行できます-ここを参照してください:http: //www.codeproject.com/Articles/3747/Explorer-column-handler-shell-extension-in-C#

ただしIColumnHandler、Vista以降ではサポートされていません。ここでは、を実装する必要がありますPropertyHandler。WindowsSDKを参照してください\Samples\winui\Shell\AppShellIntegration\PropertyHandlers

各プロパティは、プロパティスキーマXMLファイルによって記述されます。このプロパティスキーマはに登録する必要がありますPSRegisterPropertySchema()。プロパティハンドラーは、、およびオプションでを実装IInitializeWithXXXIPropertyStoreますIPropertyStoreCapabilitiesCLSID処理するファイル拡張子ごとに実装を登録する必要があります。

AllFileSystemObject残念ながら、または登録で使用することはできません*

于 2012-03-11T11:10:07.783 に答える