同階層にあるフォルダ名を連続して取得するには?

解決


でるでる  2006-04-12 13:28:28  No: 20987  IP: 192.*.*.*

delphi初心者です。
ファイルを検索するには、FindFirstFileやFindNextFile関数で出来ると思うのですが、フォルダはどうやって調べるのでしょうか?
どうかご教授願います。

編集 削除
igy  2006-04-12 13:56:19  No: 20988  IP: 192.*.*.*

FindFirst 関数でAttr パラメータにfaDirectoryを含めれる

でどうでしょう。

編集 削除
でるでる  2006-04-13 13:43:04  No: 20989  IP: 192.*.*.*

FindFirst関数で検索ファイルを「ABC¥*.」でABCフォルダの同階層を検索できましたが大丈夫ですか?

>FindFirst 関数でAttr パラメータにfaDirectoryを含めれる
勉強不足でよくわかりませんがこちらを調べたほうが安全ですかね。

編集 削除
igy  2006-04-13 14:11:27  No: 20990  IP: 192.*.*.*

>FindFirst 関数でAttr パラメータにfaDirectoryを含める

実際に確かめてみたところ、
FindFirst 関数でAttr パラメータにfaDirectoryを指定した場合、
フォルダが「隠しファイル」の設定の場合、検索に出てこないので、
Attr パラメータにはfaAnyFileを指定して、

procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
  SearchRec: TSearchRec;
  ret: integer;
begin
  ListBoxFileName.Items.Clear;
  
  S := 'c:\Program Files\*.*';

  ret := FindFirst(S, faAnyFile, SearchRec);
  if ret = 0 then
  begin
      repeat
        if SearchRec.Attr and faDirectory > 0 then
            ListBoxFileName.Items.Add(SearchRec.Name);
      until FindNext(SearchRec) <> 0;
  end;
  SysUtils.FindClose(SearchRec);
end;

のような感じですればフォルダのみ取得できそうです。

編集 削除
attributeって  2006-04-14 05:06:39  No: 20991  IP: 192.*.*.*

attr:= faHidden or faDirectory

if findfirst(s,attr,searchrec)=0 then
try
   repeat
     if (sr.attr and faDirectory)=faDirectory then       *1
     begin
        if not ((sr.Name='.') or (sr.Name<>'..')) then   *2
          ListBox.Items.Add(sr.Name)
     end;
   until findnext(sr)<>0;
finally
  findclose(sr)
end;

*1 : [ ... >0 ] で大丈夫なんでしょうか?
*2 : . や .. の処理も必要ですよね?(目的によるけど)

編集 削除
igy  2006-04-14 09:10:29  No: 20992  IP: 192.*.*.*

>*1 : [ ... >0 ] で大丈夫なんでしょうか?

Delphi5のヘルプ
TSearchRec 型


>ファイルがある属性を持っているかどうかを調べるには,その属性定数と Attr フィールド値の論理積をとります。
>その属性を持っていれば,結果は 0 より大きくなります。たとえば,見つかったファイルが非表示ファイルならば,
>(SearchRec.Attr and faHidden > 0)の評価結果は True になります。

とあるので、大丈夫だと思います。

あと、

>attr:= faHidden or faDirectory

システムファイルのフォルダも表示する場合は、さらに
 faSysFile
が必要かと。(目的によりますけど)

編集 削除
でるでる  2006-04-14 15:54:46  No: 20993  IP: 192.*.*.*

igyさん、ありがとうございます。
私のほうは解決しました。

編集 削除
Fusa  2006-04-15 00:47:01  No: 20994  IP: 192.*.*.*

解決しているところに
とても恐縮しますが

faHidden と fafaDirectory と faSysFile と faAnyFile との関係を
詳細に知っている方、教えてください。
いつも、私はfaAnyFileしか使わないので
もっと動作について理解しておきたいのです。


unit SysUtils;によると
              // 16進数    10進数   2進数
  faReadOnly  = $00000001; // 1;    000001
  faHidden    = $00000002; // 2;    000010
  faSysFile   = $00000004; // 4;    000100
  faVolumeID  = $00000008; // 8;    001000
  faDirectory = $00000010; // 16;   010000
  faArchive   = $00000020; // 32;   100000
  faAnyFile   = $0000003F; // 63;   111111
このように定義されているのは理解しています。

これが、ファイル列挙の場合
  faReadOnly  読み取り専用属性のファイル列挙
  faHidden    隠し属性のファイル列挙
  faSysFile   システムファイル列挙
  faVolumeID  ???
  faDirectory パス
  faArchive   アーカイブ属性?lzhやzipではなさそう。(?)
となっていて、それぞれのフラグをorで追加することは理解できています。
(?の部分を除いての理解です)

フォルダの列挙の場合
  faDirectory                   フォルダ列挙の場合指定する。
  faReadOnly or faDirectory     読み取り属性ファイルも読み取り属性フォルダを列挙
  faHidden or faDirectory       隠し属性ファイルと隠し属性フォルダを列挙
  faSysFile or faDirectory      システムファイルとシステムフォルダを列挙
  faVolumeID or faDirectory     ???
  faArchive     アーカイブ属性ファイルとアーカイブ属性フォルダ列挙
このような理解でいいですか?


....すいません、興味がわいたので
相乗りで質問してしまいました。

編集 削除
VolumeID  2006-04-15 01:47:03  No: 20995  IP: 192.*.*.*

faVolumeID
は、メディアの名前のようなものです。
ハードディスクにも名前があり
フロッピーやCD-ROMにもそれらはあります。

通常、列挙しても意味が無いので faVolumeIDは
あまりつかいません(少なくとも私は)

コマンドプロンプトで
c:\
dir /w
上のほうに ボリューム名はありません とか出ると思います。
それです。

編集 削除
faArchive  2006-04-15 05:39:55  No: 20996  IP: 192.*.*.*

ついでに
faArchiveはこのビットをサポートしているソフトがセット・リセットするものです。
用途はバックアップをとった時にこのビットをセットするようにするとファイル更新でこのビットがクリアされるのでバックアップ済みかどうか判断できるというものです。
DOSの時代にはこれを利用したソフトがいくつかありましたが現在も利用しているソフトがあるかは分かりません。

編集 削除
Fusa  2006-04-15 10:47:24  No: 20997  IP: 192.*.*.*

ありがとうございました。
とてもよく理解できました。

編集 削除
faArchive  2006-04-15 20:08:16  No: 20998  IP: 192.*.*.*

訂正します。
faArchiveのセット・クリアの説明が逆でした。
ファイルを更新するとfaArchiveがセットされます。(新規作成も含む)
バックアップソフトはバックアップをとった時にこれをクリアする様にします。

編集 削除
でるでる  2006-04-21 00:15:20  No: 20999  IP: 192.*.*.*

書き出しが自分なので解決しておきます。

編集 削除