Windowsエクスプローラーで表示できるコメント、ビットレート、アクセス日、カテゴリなど、C#の拡張ファイルプロパティを読み書きする方法を見つけようとしています。これを行う方法はありますか?編集: 私は主にビデオ ファイル (AVI/DIVX/...) の読み取り/書き込みを行います。
10 に答える
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)}");
}
}
}
ソリューション 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: プロパティ ハンドラーの実装
ID3 リーダー向けの CodeProject 記事があります。また、他のプロパティの詳細については、kixstart.org のスレッドを参照してください。基本的に、 のフォルダシェル オブジェクトでGetDetailsOf()
メソッドを呼び出す必要があります。shell32.dll
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への参照を追加する必要があります。
このスレッドをありがとう!exeのファイルバージョンを知りたいときに役立ちました。ただし、拡張プロパティと呼ばれるものの最後の部分を自分で把握する必要がありました。
Windows エクスプローラーで exe (または dll) ファイルのプロパティを開くと、[バージョン] タブが表示され、そのファイルの拡張プロパティが表示されます。これらの値の 1 つにアクセスしたかったのです。
これに対する解決策は、プロパティ インデクサー FolderItem.ExtendedProperty です。プロパティの名前からすべてのスペースを削除すると、値が取得されます。たとえば、File Version は FileVersion になり、そこにあります。
これが他の人に役立つことを願っています。この情報をこのスレッドに追加すると思いました。乾杯!
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);
}
プロパティを書き込もうとしているファイルの種類はわかりませんが、taglib-sharpは優れたオープン ソースのタグ付けライブラリで、このすべての機能をうまくまとめています。一般的なメディア ファイル タイプのほとんどをサポートする機能が組み込まれていますが、ほぼすべてのファイルに対してより高度なタグ付けを行うこともできます。
編集: taglib シャープへのリンクを更新しました。古いリンクは機能しなくなりました。
編集: kzuのコメントごとにリンクをもう一度更新しました。