y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

ファイルプロパティを抜き出す

イメージデータや音声、動画データを全文検索したいという時、真っ先に使いたいのがファイルプロパティ。人の成果を盗みつつ、さっさと作ってみた。(エラー処理なし、ノードキュメント、ノーテスト)
MP3やJPEGのプロパティを抜けることを確認したので、あとはHyperEstraierから呼び出すラッパーをbatファイルで作成して、estcmdから呼ぶだけで、静止画、音声、動画データのプロパティを全文検索できるという寸法。→出来た。

・インデキシング(音声データの場合)
estcmd.exe gather -cl -fx .mp3,.wav,.ogg,.wma,.m4a T@propOut -fz -il ja -pc CP932 -sd -cm -kn 32 -um -aa @genre music d:\data\index\www d:\data\ppt

・propOut.batの内容
@echo off
getFileProperty.exe %1 > %2


■参考サイト

@IT総合トップ > @IT CORE > Insider.NET > .NET TIPS > MP3ファイルからタイトルやアーティスト名などを取得するには?[C#、VB]
特定のフォルダーから、高さと幅が指定のサイズではないイメージ ファイルをすべて検索する方法はありますか


■ファイルフォーマット(静止画、動画、音声)とジャンルの対応

estcmd.exe gather -cl -fx .jpg,.jpeg,.jpe,.gif,.png,.bmp,.j2k,.jp2,.svg,.eps T@propOut -fz -il ja -pc CP932 -sd -cm -kn 32 -um -aa @genre image d:\data\index\www d:\data\ppt

estcmd.exe gather -cl -fx .mpeg,.mpg,.avi,.swf,.fla,.wmv,.mp4 T@propOut -fz -il ja -pc CP932 -sd -cm -kn 32 -um -aa @genre movie d:\data\index\www d:\data\ppt

estcmd.exe gather -cl -fx .mp3,.wav,.ogg,.wma,.m4a T@propOut -fz -il ja -pc CP932 -sd -cm -kn 32 -um -aa @genre music d:\data\index\www d:\data\ppt

誠にお恥ずかしながら、テスト的に作ったプログラムのソースコードを貼っておきます。

C#ソースコード"getFileProperty.exe"

using System;
using System.Collections.Generic;
using System.Text;
using Shell32;
using System.IO;

namespace getFileProperty
{
class Progam
{
static void Main(string[] args)
{
string s = "";
string ostr = "";
string ofile = "";
string enc = "";
string deli = ",";

if (args.Length == 0)
{
Console.WriteLine("使い方を参照するにはhelpとキー入力してください。");
Console.WriteLine("このアプリケーションを終了するにはexitとキー入力してください。");
Console.WriteLine("ファイルプロパティの抽出をするには、対象ファイル名をフルパス指定してください。");
s = Console.ReadLine();
}
else
{
for (int n = 0; n < args.Length; ++n)
{
switch(n){
case 0:
s = args[n];
break;
case 1:
ofile = args[n];
break;
case 2:
enc = args[n];
break;
case 3:
deli = args[n];
break;
}
}
}

while (s != null)
{
if (s.ToLower() == "exit")
{
return;
}

if (s.ToLower() == "help")
{
Console.WriteLine("使い方");
Console.WriteLine("使い方1:>getFileProperty.exe [ファイル名]");
Console.WriteLine("使い方2:>getFileProperty.exe [ファイル名] > [結果テキストファイル名]");
Console.WriteLine("使い方3:>getFileProperty.exe < [リストファイル名] > [結果テキストファイル名]");
Console.WriteLine("使い方4:>dir フォルダ名\\*.jpg /s /b | getFileProperty.exe > [結果テキストファイル名]");
Console.WriteLine("ファイル名を指定してください。");
}
s = s.Replace("\"", "");
if (s.Length > 4)
{
if (System.IO.File.Exists(s))
{

string dir = Path.GetDirectoryName(s); // ファイルのあるディレクト
if (dir.Length == 0)
{
dir = System.IO.Directory.GetCurrentDirectory().ToString();
}
string file = Path.GetFileName(s); //ファイル名

ShellClass shell = new ShellClass();
Folder f = shell.NameSpace(dir);
FolderItem item = f.ParseName(file);

ostr = dir + deli + file+deli;
ostr+=s+deli;
for (int i = 0; i < 41; i++)
{
ostr += f.GetDetailsOf(item, i); //0-40
ostr += deli;
}
/*
// 0: 名前
// 1: サイズ
// 2: 種類
// 3: 更新日時
// 4: 作成日時
// 5: アクセス日時
// 6: 属性
// 7: 状態
// 8: 所有者
// 9: 作成者
// 10: タイトル
// 11: 表題
// 12: カテゴリ
// 13: ページ数
// 14: コメント
// 15: 著作権
// 16: アーティスト
// 17: アルバムのタイトル
// 18: 年
// 19: トラック番号
// 20: ジャンル
// 21: 長さ
// 22: ビットレート
// 23: 保護
// 24: カメラのモデル
// 25: 写真の撮影日
// 26: ディメンション
// 27: 画像サイズ幅
// 28: 画像サイズ高さ
// 29: エピソード
// 30: プログラムの説明
// 31:
// 32: オーディオサンプルサイズ
// 33: オーディオサンプルレート
// 34: チャンネル
// 35: 会社名
// 36: 説明
// 37: ファイルバージョン
// 38: 製品名
// 39: 製品バージョン
// 40: キーワード
*/

Console.WriteLine(ostr);
return;
}
else
{
Console.WriteLine(s + "が存在しません。");
}
}
else
{
if (s.ToLower() != "help")
{
Console.WriteLine(s + "は不正なファイル名です。");
}
}
s = Console.ReadLine();
}


}
}
}


■未実装部分

第2引数:出力ファイル名
第3引数:出力エンコーディング
第4引数:区切り文字(出力ファイル名がTSV、CSVの場合)
などの引数に応じた処理一式が未実装。