- PR -

ファイル、ディレクトリの存在パターンやファイル名チェックの汎用化?

1
投稿者投稿内容
platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 2008-07-10 20:35
すいません、アイデア募集させてください。
実際のソースコードサンプルを教えてくださいではなく、アイデアレベルの
アドバイスをいただきたく。

【やりたいこと】
あるディレクトリの下に、
こういう名前のフォルダが必要で、その下には○○○01.pdf〜○○○99.pdf
みたいなファイル命名体系(欠番があってもよい)・・・
などのファイルの存在有無、ファイル名が適正基準にマッチしているか、
などのディレクトリ検査を行うときの
汎用化するのにいい方法ないですかね。
ディレクトリは更にサブディレクトリを含む可能性がある前提とします。

チェックするレベルは
ファイルの中身の走査チェックは不要で
有無と名称のレベルまでのチェックとします。
また、必要なファイルがあるだけではなく、
存在してはいけないおかしなファイルがあったら
それも摘発するものとします。


何となく、ファイル、ディレクトリをXMLの値やノード名として表現して、
XMLを生成し、そのXMLを
事前に定義しておくXMLスキーマによりチェックするなんて
方法かな?と思ったのですが、
何か他にうまい(思わず拍手するような)方法はないでしょうか。

デザインパターンとしてのCompositeは
格納には向くけど、適正チェック部分を汎用化することは
難しそうな気がして・・・・
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-07-10 23:51
引用:

platiniさんの書き込み (2008-07-10 20:35) より:
【やりたいこと】
あるディレクトリの下に、
こういう名前のフォルダが必要で、その下には○○○01.pdf〜○○○99.pdf
みたいなファイル命名体系(欠番があってもよい)・・・
などのファイルの存在有無、ファイル名が適正基準にマッチしているか、
などのディレクトリ検査を行うときの
汎用化するのにいい方法ないですかね。



ディレクトリに関するルール部分が詳しいところがわかりません。
例えば、「A」という文字を含むディレクトリ名というルールだとしたら、

・検査対象の直下のディレクトリは「A」を含むことが前提だとして、
それ以下のサブディレクトリの命名ルールも同じなのか?
それとも違うのか?違うとしたらどんなルールが考えられるのか?
(サブディレクトリについては違う条件だった場合、それが
上位のディレクトリに依存してルールが変わるような場合、
判断ロジックそのものを外だしにする必要があるでしょう)

・また、「A」を含まないディレクトリについては無視するのか?
それともNGなディレクトリとして摘発するのか?

汎用化を考えるには、ディレクトリとファイルの検査条件について
詳細を検討して、どこまでの機能を盛り込むかを考える必要がありますね。

さらに、その結果としてどんな情報を返すのか?ということも決める必要があります。

その内容次第では、単なる1メソッドで十分かもしれませんし、
あるいは、専用のインターフェースを設計する必要があるかもしれません。
検査条件用のクラス(インターフェース)、検査結果用のクラスを
どのように規定するかにも関わってきます。

チェック方法そのものは正規表現を使えば実現できるのではないかと
思いますが、肝になるのは実際の処理ではなく、
そのINPUT/OUTPUTの仕様かと思います。

このINPUT/OUTPUTの仕様についてのアイデア募集ではないですよね?
#こればっかりは実現したいことの詳細次第なのでなんとも言えないと思います。

後、実装の質問ではないとのことですが、想定する言語はなんでしょうか?
# C#ならyeild returnの出番かなと思ってみたりするので、
# 言語によって微妙に設計指針が変わるかもしれません

ものすごく大雑把なアイデアとしては私なら、
ディレクトリやファイルを列挙する機能とその結果得られたフルパスを
引数にとるデリゲートを用意するかなと思います。

platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 2008-07-11 11:09
よねKEN様 RESありがとうございます。
まず、今回のファイルディレクトリチェックの話を別にして、
C#は1.1(VS2003)以来久々なものですから、
yield return というものを知りませんでした。非常に勉強になりました。
これ、確かに便利ですね。

引用:

・検査対象の直下のディレクトリは「A」を含むことが前提だとして、
それ以下のサブディレクトリの命名ルールも同じなのか?
それとも違うのか?違うとしたらどんなルールが考えられるのか?
(サブディレクトリについては違う条件だった場合、それが
上位のディレクトリに依存してルールが変わるような場合、
判断ロジックそのものを外だしにする必要があるでしょう)



サブディレクトリ以下の命名規則は上位階層と無関係に
規則があります。ここで、無関係とは、
ランダムでどんなパターンが来るか分からないという意味ではなく、
法則性はあり、上位階層との一体渾然的に(曖昧な表現で申し訳ないです)
決まる法則なのだが、
上位の法則性とは異なる別の法則性でチェックが必要と言う意味です。

引用:

・また、「A」を含まないディレクトリについては無視するのか?
それともNGなディレクトリとして摘発するのか?



摘発です(笑)

引用:

チェック方法そのものは正規表現を使えば実現できるのではないかと
思いますが、肝になるのは実際の処理ではなく、
そのINPUT/OUTPUTの仕様かと思います



本当にそのご指摘の通りで、各単品単位のチェック行為は
正に正規表現チェックです。本当にINPUT/OUTPUTの仕様の問題です。

───・───・───・───・───・───・───・───・──

と、このように書いている最中にアイデアを思いついたのですが、
同一階層(XMLでいえばSibilingにあたる階層)のファイルは同じ
パターンのチェックとなります。名称が浮動となるのは、
ファイルの単位であって、ディレクトリ名称は固定といえるので、

いっそ、チェックしたい構造と同じファイル階層を作成し、
ファイル名の正規表現チェックパターンを、そのファイルの
中にテキストとして正規表現パターンとして記載しておく
みたいな形でできそうな気がしてきました。

1)事前に適正なあるべき(こうチェックしたい)ディレクトリツリーの適正
 ディレクトリを作成しておく( 手作業で事前に )

 ファイル名のチェックパターンは、適正な階層のところにテキストファイルを
 置いて、その中に正規表現パターンを記載しておく

2)GUIで 事前静的モデルディレクトリと評価対象ディレクトリを指定

3)ディレクトリ(フォルダレベル)は単純にチェック
  ディレクトリ名称は固定なので名称のチェックは単純でよい

4)ファイルレベルは、モデルパターンからテキストファイルを読み込み
  正規表現でチェック

これが一番汎用性があるように思えてきました。





unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-07-12 01:18
引用:

platiniさんの書き込み (2008-07-11 11:09) より:
いっそ、チェックしたい構造と同じファイル階層を作成し、
ファイル名の正規表現チェックパターンを、そのファイルの
中にテキストとして正規表現パターンとして記載しておく
みたいな形でできそうな気がしてきました。


要求仕様は良くは知らないのですが、それだったらひとつの XML ファイルにまとめて記述するやりかたのほうが、取り扱いが楽ではないでしょうか。

ただ、
引用:

platiniさんの書き込み (2008-07-10 20:35) より:
何となく、ファイル、ディレクトリをXMLの値やノード名として表現して、
XMLを生成し、そのXMLを
事前に定義しておくXMLスキーマによりチェックするなんて
方法かな?と思ったのですが、
何か他にうまい(思わず拍手するような)方法はないでしょうか。


の「XMLスキーマ」とは xsd のようなものでしょうか?もしそうだとすると、複雑すぎるかな、とも思いました。

また、仕様は多段に分けたほうが良いと思います。
たとえば、チェックのメソッドのインターフェースだけを定義するフェーズと、そのインターフェースを実現するフェーズを分けたほうが良いかもしれません。

前者は、擬似コード的に書くと、
コード:
bool check(string fullPath); // ファイル1つ1つを独立して検査できる。


のようなピンポイント的なチェック用のメソッドで済むのか、それとも、
コード:
List<string> check(string directory); // ディレクトリー内のファイル同士に依存関係がありうる。


ぐらいには検査範囲が広いのか、ということを定義します。

後者は、正規表現を使うのかや、XML を使うのか、という話になりますが、いわゆるプラグインやアドイン・アドオンの作り方、という話になると思います。dll をダイナミックにロードするようなのが簡単で汎用性はとても高いですが、プラグインを作ってもらう人にプログラミングを要求することになってしまいます。正規表現も、もしもそれを一種のプログラムとみなせば同じことでしょう。
XML を使うと、検証とかもしないといけないかもしれないので面倒くさいし、結局難しいんですよね。
1

スキルアップ/キャリアアップ(JOB@IT)