110

Windowsエクスプローラーで表示できるコメント、ビットレート、アクセス日、カテゴリなど、C#の拡張ファイルプロパティを読み書きする方法を見つけようとしています。これを行う方法はありますか?編集: 私は主にビデオ ファイル (AVI/DIVX/...) の読み取り/書き込みを行います。

4

10 に答える 10

89

VB に夢中でない方のために、ここに C# を示します。

[参照] ダイアログの [COM] タブからMicrosoft Shell Controls and Automationへの参照を追加する必要があることに注意してください。

public static void Main(string[] args)
{
    List<string> arrHeaders = new List<string>();

    Shell32.Shell shell = new Shell32.Shell();
    Shell32.Folder objFolder;

    objFolder = shell.NameSpace(@"C:\temp\testprop");

    for( int i = 0; i < short.MaxValue; i++ )
    {
        string header = objFolder.GetDetailsOf(null, i);
        if (String.IsNullOrEmpty(header))
            break;
        arrHeaders.Add(header);
    }

    foreach(Shell32.FolderItem2 item in objFolder.Items())
    {
        for (int i = 0; i < arrHeaders.Count; i++)
        {
            Console.WriteLine(
              $"{i}\t{arrHeaders[i]}: {objFolder.GetDetailsOf(item, i)}");
        }
    }
}
于 2010-01-19T19:16:18.817 に答える
32

ソリューション 2016

次の NuGet パッケージをプロジェクトに追加します。

  • Microsoft.WindowsAPICodePack-Shellマイクロソフトによる
  • Microsoft.WindowsAPICodePack-Coreマイクロソフトによる

プロパティの読み取りと書き込み

using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

string filePath = @"C:\temp\example.docx";
var file = ShellFile.FromFilePath(filePath);

// Read and Write:

string[] oldAuthors = file.Properties.System.Author.Value;
string oldTitle = file.Properties.System.Title.Value;

file.Properties.System.Author.Value = new string[] { "Author #1", "Author #2" };
file.Properties.System.Title.Value = "Example Title";

// Alternate way to Write:

ShellPropertyWriter propertyWriter =  file.Properties.GetPropertyWriter();
propertyWriter.WriteProperty(SystemProperties.System.Author, new string[] { "Author" });
propertyWriter.Close();

重要:

ファイルは、割り当てられた特定のソフトウェアによって作成された有効なファイルでなければなりません。すべてのファイル タイプには特定の拡張ファイル プロパティがあり、すべてが書き込み可能であるとは限りません。

デスクトップでファイルを右クリックしてプロパティを編集できない場合は、コードでも編集できません。

例:

  • デスクトップに txt ファイルを作成し、拡張子を docx に変更します。AuthorまたはTitleプロパティを編集することはできません。
  • Word で開いて編集し、保存します。今すぐできます。

したがって、必ずいくつかを使用してくださいtry catch

詳細トピック: Microsoft Docs: プロパティ ハンドラーの実装

于 2016-06-23T09:02:45.800 に答える
27

ID3 リーダー向けの CodeProject 記事があります。また、他のプロパティの詳細については、kixstart.org のスレッドを参照してください。基本的に、 のフォルダシェル オブジェクトでGetDetailsOf()メソッドを呼び出す必要があります。shell32.dll

于 2008-10-20T22:17:24.910 に答える
25

VB.NETのこのサンプルは、すべての拡張プロパティを読み取ります。

Sub Main()
        Dim arrHeaders(35)

        Dim shell As New Shell32.Shell
        Dim objFolder As Shell32.Folder

        objFolder = shell.NameSpace("C:\tmp")

        For i = 0 To 34
            arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i)
        Next
        For Each strFileName In objfolder.Items
            For i = 0 To 34
                Console.WriteLine(i & vbTab & arrHeaders(i) & ": " & objfolder.GetDetailsOf(strFileName, i))
            Next
        Next

    End Sub

[参照]ダイアログの[ COM ]タブから、Microsoft Shell ControlsandAutomationへの参照を追加する必要があります。

于 2008-11-28T12:28:23.303 に答える
8

このスレッドをありがとう!exeのファイルバージョンを知りたいときに役立ちました。ただし、拡張プロパティと呼ばれるものの最後の部分を自分で把握する必要がありました。

Windows エクスプローラーで exe (または dll) ファイルのプロパティを開くと、[バージョン] タブが表示され、そのファイルの拡張プロパティが表示されます。これらの値の 1 つにアクセスしたかったのです。

これに対する解決策は、プロパティ インデクサー FolderItem.ExtendedProperty です。プロパティの名前からすべてのスペースを削除すると、値が取得されます。たとえば、File Version は FileVersion になり、そこにあります。

これが他の人に役立つことを願っています。この情報をこのスレッドに追加すると思いました。乾杯!

于 2010-08-23T12:25:28.130 に答える
8

GetDetailsOf()メソッド - フォルダー内のアイテムに関する詳細を取得します。たとえば、サイズ、タイプ、最終変更時刻などです。ファイルのプロパティは、Windows-OSバージョンによって異なる場合があります。

List<string> arrHeaders = new List<string>();

 Shell shell = new ShellClass();
 Folder rFolder = shell.NameSpace(_rootPath);
 FolderItem rFiles = rFolder.ParseName(filename);

 for (int i = 0; i < short.MaxValue; i++)
 {
      string value = rFolder.GetDetailsOf(rFiles, i).Trim();
      arrHeaders.Add(value);
 }
于 2013-02-27T12:01:48.937 に答える
1

プロパティを書き込もうとしているファイルの種類はわかりませんが、taglib-sharpは優れたオープン ソースのタグ付けライブラリで、このすべての機能をうまくまとめています。一般的なメディア ファイル タイプのほとんどをサポートする機能が組み込まれていますが、ほぼすべてのファイルに対してより高度なタグ付けを行うこともできます。

編集: taglib シャープへのリンクを更新しました。古いリンクは機能しなくなりました。

編集: kzuのコメントごとにリンクをもう一度更新しました。

于 2008-10-20T22:42:05.250 に答える