エクスプローラーでファイルやフォルダは名前で識別しますが、入力する都合上短めで英数字を使うことが多いです。
英語圏で生まれた文化である点もありますが、アルファベットの方が変換などを含まないのでストレートに入力できる点もあると思います。
そうなりますと、似たような名前だったり抽象的だったり、多量にあると連番にしたりと、ファイルの内容が想像しがたい名前になっていることがしばしばあります。コメントをつけることでファイルの内容を認識しやすくしたいと考えています。
具体的に以下の方法を思いつきました。
- ファイルのメタデータに埋め込み方式
- ファイルと同名で拡張子が.txtのファイルに保存方式
- ADSにコメントをセットする方式
- DBのテーブルに保存方式
いずれの方法も一長一短あるので一つ一つ検討してみたいと思います。
ファイルのメタデータに埋め込み方式
ファイル内のメタ情報を埋め込む領域などがあり、具体的にはjpegにはexif情報として写真の撮影日、場所などの位置情報が埋め込むことが出来ます。そちらの領域にコメントをセットすれば良いです。
良い点
ファイルに埋め込まれているので、ファイルを外に持ち出してもコメントが保持されます。(写真の位置情報などは困りますが…)
広く知られた規格ですので、ソフトによって対応している場合があります。
詳細は検証していないですが、エクスプローラーの表示項目にコメント増やすと表示されます。また、ファイルのプロパティでコメントを編集することが出来ます。
問題点
画像ファイル、映像ファイル、音楽ファイルなどはメタデータとして埋め込めますが、それ以外は対応していない可能性が高い。エクスプローラーのフォルダはdesktop.iniという不可視属性ファイルで対応しています。
エクスプローラーで一括変更の仕組みやコメントを検索する方法などがあれば良いのですが見つけられません。
ユーザーがプログラムで対応する場合、拡張子ごとに対応プログラムを書く必要があり、メタデータを埋め込めないファイルフォーマットはお手上げである。
ファイルと同名で拡張子が.txtのファイルに保存方式
具体例として、sample.jpgであればsample.jpg.txtというファイルを同じフォルダに作成する方法。
良い点
- ファイルシステムに依存しない(Windows以外でもOK)
- テキストファイルが編集できるソフトであれば運用可能
- シンプルで理解しやすい
問題点
ファイルに対しコメント用のファイルがあるので、ファイルの移動、コピー、削除を同時に行う必要がある。ファイルを一覧表示する際、コメント用のファイルが表示されるとファイル件数が増えて検索しにくくなる。
問題点はユーザープログラムを作成することで対応できるかもしれない。
CLIではls、copy, mv, del などのファイル操作けいの外部コマンドを作成しコメントファイルに対応するようにする。
GUIではファイルマネージャを作りデフォルトコメントファイルを表示しないスタイし、検索性を高める。
ADSにコメントをセットする方式
NTFSで代替データストリーム(ADS)にコメント項目を作成しコメントする方法
過去記事
良い点
txtファイル方式と違いADSを使う場合ファイルの一覧には基本存在しないが、プログラムからはファイルの様にアクセスすることが出来る。
問題点
NTFSの仕組みであり、それ以外のファイルシステムを使ったファイルサーバーなどに保存するファイル、他のPCへの移動などではコメントが保持されない。
DBのテーブルに保存方式
データベースにコメント用のファイルのパスとコメント内容を保持するテーブルを用意する。
ユーザープログラムでテーブルを更新するプログラムを作成する。
良い点
ユーザープログラムを作ること前提ですので自由度が高く、個人の好みに合わせられる。
悪い点
機能を拘りだすとキリがない。
ユーザープログラムを作成
どの方式をとるにしても、コメントの検索、編集機能が欲しいところです。
GUIでファイルマネージャを作ったりCLIで拡張版lsコマンドをつくるにしても、コメントを取得する分レスポンスが悪くなるのが難点。従来のファイルの一覧の機能はそのままで、後からコメントを取得する方法が好ましい。
GUIであれば、コメント取得のタイミングをファイルの一覧の表示後非同期で取得しコメント部分だけ後から更新する方法が考えられます。
CUIの場合良い方法が思いつかないので、取得するファイル件数に制限を掛けてレスポンススピードを担保したい。
同様な問題は画像ファイルのサムネイルを作成する場面でも遭遇しますので、参考となるサムネイル作成のルーチンを探すと良いと思われる。(当サイトでもサムネイル作成の記事がありますが参考にならない)
CUIの場合外部コマンドをPowerShellスクリプトで作成することが出来ると思われます。
ためしに.txt形式のコメントに対応したls(GetChildItem)を作成してみます。
名前をls-c.ps1とします。
# コメントファイル(.txt)対応版ls
param(
[string]
$Path = "."
)
Get-ChildItem -Path $Path | ForEach-Object -Process {
$ext = $_.Extension.ToUpper() # 拡張子
$dir = [IO.Path]::GetDirectoryName($_.FullName) # ディレクトリ
$baseName = [IO.Path]::GetFileNameWithoutExtension($_.Name)
$basePath = (Join-Path $dir $baseName) # 元ファイル
if (($ext-eq ".TXT") -and (Test-Path $basePath)) {
# コメントファイルの場合何もしない
return
}
$comment = ""
$commentPath = $_.FullName + ".txt"
if (Test-Path $commentPath) {
# コメントファイルがある場合
# コメントを取得
$comment = Get-Content -Path $commentPath
}
# コメントを追加し出力
$newObject = $_ | Select-Object *
$newObject | Add-Member -MemberType NoteProperty -Name Comment -Value $comment
$newObject
}
拡張子が.txtの場合コメントファイルの可能性があるので、パスから.txtを除いた文字列のファイルが無いか確認します。
コメントファイルの場合表示させないように、何もせず次のループに移動します。
コメントファイルでないことが確認されたファイルに対し、コメントファイルが無いか、パスに.txtを追加した文字列のファイルが無いか確認します。
有る場合コメントファイルですので内容を読み込み、comment変数にセットし最終的に出力します。
$_の内容を余すことなく戻したいのですが、良い方法が見つからず仕方がなくPSCustomObject
にしました。
そのため見た目がlsとことなり、select(Select-Object)で必要な項目だけ絞り込みます。
./ls-c.ps1 | select Comment, LastWriteTime, Length, Name
PowerShellのパイプライン機能を使えば、さらに特定の文字をコメントを含むファイルを絞り込むことが出来ます。
コメント