属性に特定の属性が含まれるかどうかを調べたい

投稿者: 投稿日:2018/07/26(Thu) 22:24:36 No.2151

 こんにちは、お世話になります。

 ファイルやフォルダの属性を取得して、そのファイル(またはフォルダ)に特定の属性がついているかどうかを調べて、条件分岐させたいのですが、何か良い方法はありますでしょうか。
 属性が1つだけであれば、

もし属性が「隠しファイル」なら

という感じで行けるんですが、属性が2つ以上(例えば、「隠しファイル+システムファイル」など)ついていると、上記の判定ではうまくいきません。
 文字列検索を使えばいいとは思ってみたりもしているんですが、もっとちゃんとした方法があるのではないかと思っています。
 上記の件について、何かアドバイスをいただけると幸いです。

 以上、よろしくお願いいたします。

Re: 属性に特定の属性が含まれるかどうかを調べたい

投稿者:通りすがり 投稿日:2018/08/01(Wed) 23:14:28 No.2154

数値が取れるとよいのですが、探したり試した限り、うまい方法は無いようです。
XXの内容 とすると、文字列表記となったものが取れるので、
XXの値 とすることで、数値表記となったものがとれれば便利そう という感じです。
以下、列挙値(ドットネット的には、Enum型)を変換する種類を作ってみました。
ファイル情報のファイル属性を取得したものを、元値に変換することで、数値表記の値が取れます。その値に対して、論理積を用いることで判断する形になります。
※本来、Enumの値は文字列ではなく、数値に変換した方がプログラムからは処理しやすいです。
試していて少し気になったのは、「読み取り専用」が列挙値から文字列表記に自動変換される過程で消えてしまっているように見えます。原因はわかりません。
------------------------------
// 可能ならば、読み込み専用+隠し+アーカイブ可能 が良いです。
ファイルAというファイル情報(「d:\AAAAA.txt」)を作る
属性Aは、ファイルAのファイル属性
ファイル属性変換器という列挙変換器(「System.IO.FileAttributes」)を作る

// 列挙値を取得した場合、プロデルが自動的に和名の別の列挙型に変換するので、表示を行うと日本語名を+で連結した形式になる。
// 列挙名を取得した場合、変換器を作成する際に指定した列挙型の名前をカンマで連結した形式になる。
// 文字列を指定する場合、変換器に指定した列挙型の名前とカンマの組み合わせで指定する必要がある。
/*
ファイル属性変換器で属性Aから元値を取得して表示
ファイル属性変換器で48から列挙値を取得して表示
ファイル属性変換器で48から列挙名を取得して表示
ファイル属性変換器で「archive」から列挙値を取得して表示
ファイル属性変換器で属性Aから列挙名を取得して表示
ファイル属性変換器で「archive」から元値を取得して表示
ファイル属性変換器で「archive, directory」から元値を取得して表示
ファイル属性変換器で属性Aから単一列挙名を取得して表示
ファイル属性変換器から列挙名の一覧を取得して表示
ファイル属性変換器から列挙値の一覧を取得して表示
ファイル属性変換器から変換辞書を取得して表示
*/
属性Aを表示

結果名は、「」
結果値は、「」
変換辞書は、ファイル属性変換器から変換辞書を取得
値は、ファイル属性変換器で属性Aから元値を取得
列挙名一覧は、ファイル属性変換器から列挙名の一覧を取得
列挙名一覧のすべての列挙名についてそれぞれ繰り返す
  比較値は、変換辞書の列挙名
  もし、値と比較値の論理積が、比較値ならば、
    もし、結果名が空でなければ、
      結果名は、結果名に「,」を末尾に加えたもの
    もし終わり
    結果名は、結果名に列挙名を末尾に加えたもの
    もし、結果値が空でなければ、
      結果値は、結果値に「,」を末尾に加えたもの
    もし終わり
    結果値は、結果値に[ファイル属性変換器で比較値から列挙値を取得]を末尾に加えたもの
  もし終わり
繰り返す終わり
結果値を表示する
結果名を表示する

列挙変換器とは
  +変換器型
  +列挙型
  +対象列挙型
  +基になる型
  【型名:文字列】ではじめ手順
    変換器型というドットネット型(「System.Convert」)を作る
    列挙型というドットネット型(「System.Enum」)を作る
    対象列挙型というドットネット型(型名)を作る
    基になる型は、列挙型から「GetUnderlyingType」を{対象列挙型の管理型}で呼び出す
  終わり
  【自分】から列挙名の一覧を取得するの手順
    【一覧】
    一覧は、列挙型から「GetNames」を{対象列挙型の管理型}で呼び出す
    一覧を返す
  終わり
  【自分】から列挙値の一覧を取得するの手順
    【一覧】
    一覧は、列挙型から「GetValues」を{対象列挙型の管理型}で呼び出す
    一覧を返す
  終わり
  【自分】から変換辞書を取得するの手順
    【一覧】
    【結果】
    【値】
    【列挙名】
    一覧は、列挙型から「GetNames」を{対象列挙型の管理型}で呼び出す
    一覧のすべての列挙名についてそれぞれ繰り返す
      値は、列挙型から「Parse」を{対象列挙型の管理型,列挙名,○}で呼び出す
      値は、変換器型から「ChangeType」を{値,基になる型}で呼び出す
      結果の列挙名は、値
    繰り返し終わり
    結果を返す
  終わり
  【自分】で【列挙値:列挙値】から列挙名を取得するの手順
    【値】
    値は、変換器型から「ChangeType」を{列挙値,基になる型}で呼び出す
    値は、列挙型から「Format」を{対象列挙型の管理型,値,「G」}で呼び出す
    値を返す
  終わり
  【自分】で【元値:整数】から列挙名を取得するの手順
    【値】
    値は、列挙型から「Format」を{対象列挙型の管理型,元値,「G」}で呼び出す
    値を返す
  終わり
  【自分】で【列挙値:列挙値】から単一列挙名を取得するの手順
    【値】
    値は、列挙型から「GetName」を{対象列挙型の管理型,列挙値}で呼び出す
    値を返す
  終わり
  【自分】で【列挙値:列挙値】から元値を取得するの手順
    【値】
    値は、変換器型から「ChangeType」を{列挙値,基になる型}で呼び出す
    値を返す
  終わり
  【自分】で【列挙名:文字列】から元値を取得するの手順
    【値】
    値は、列挙型から「Parse」を{対象列挙型の管理型,列挙名,○}で呼び出す
    値は、変換器型から「ChangeType」を{値,基になる型}で呼び出す
    値を返す
  終わり
  【自分】で【列挙名:文字列】から列挙値を取得するの手順
    【値】
    値は、列挙型から「Parse」を{対象列挙型の管理型,列挙名,○}で呼び出す
    値を返す
  終わり
  【自分】で【元値:整数】から列挙値を取得するの手順
    【値】
    値は、列挙型から「Parse」を{対象列挙型の管理型,元値の内容}で呼び出す
    値を返す
  終わり
終わり

Re^2: 属性に特定の属性が含まれるかどうかを調べたい

投稿者: 投稿日:2018/08/07(Tue) 22:28:16 No.2156

 こんにちは、お世話になります。

 なかなか難しそうですね。
 もうちょっと頑張ってみます。

 それでは。

「値」設定項目を加えます

投稿者:ゆうと 投稿日:2018/08/20(Mon) 01:05:10 No.2188

こんにちは ゆうとです。

凄い力業ですね...

ひとまず次のバージョンにて、「列挙値」種類に「値」設定項目を加えることにします。
整数を返しますので、論理演算で判定ができるようになります。

列挙値については、TTSneoから引き継いだ仕様が手つかずになっていますので
プロデル的な書き方も考えたいと思っています。

▲ページの先頭へ

- WebForum -