delphi初心者です。
ファイルを検索するには、FindFirstFileやFindNextFile関数で出来ると思うのですが、フォルダはどうやって調べるのでしょうか?
どうかご教授願います。
FindFirst 関数でAttr パラメータにfaDirectoryを含めれる
でどうでしょう。
FindFirst関数で検索ファイルを「ABC¥*.」でABCフォルダの同階層を検索できましたが大丈夫ですか?
>FindFirst 関数でAttr パラメータにfaDirectoryを含めれる
勉強不足でよくわかりませんがこちらを調べたほうが安全ですかね。
>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;
のような感じですればフォルダのみ取得できそうです。
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 : . や .. の処理も必要ですよね?(目的によるけど)
>*1 : [ ... >0 ] で大丈夫なんでしょうか?
Delphi5のヘルプ
TSearchRec 型
で
>ファイルがある属性を持っているかどうかを調べるには,その属性定数と Attr フィールド値の論理積をとります。
>その属性を持っていれば,結果は 0 より大きくなります。たとえば,見つかったファイルが非表示ファイルならば,
>(SearchRec.Attr and faHidden > 0)の評価結果は True になります。
とあるので、大丈夫だと思います。
あと、
>attr:= faHidden or faDirectory
システムファイルのフォルダも表示する場合は、さらに
faSysFile
が必要かと。(目的によりますけど)
igyさん、ありがとうございます。
私のほうは解決しました。
解決しているところに
とても恐縮しますが
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 アーカイブ属性ファイルとアーカイブ属性フォルダ列挙
このような理解でいいですか?
....すいません、興味がわいたので
相乗りで質問してしまいました。
faVolumeID
は、メディアの名前のようなものです。
ハードディスクにも名前があり
フロッピーやCD-ROMにもそれらはあります。
通常、列挙しても意味が無いので faVolumeIDは
あまりつかいません(少なくとも私は)
コマンドプロンプトで
c:\
dir /w
上のほうに ボリューム名はありません とか出ると思います。
それです。
ついでに
faArchiveはこのビットをサポートしているソフトがセット・リセットするものです。
用途はバックアップをとった時にこのビットをセットするようにするとファイル更新でこのビットがクリアされるのでバックアップ済みかどうか判断できるというものです。
DOSの時代にはこれを利用したソフトがいくつかありましたが現在も利用しているソフトがあるかは分かりません。
ありがとうございました。
とてもよく理解できました。
訂正します。
faArchiveのセット・クリアの説明が逆でした。
ファイルを更新するとfaArchiveがセットされます。(新規作成も含む)
バックアップソフトはバックアップをとった時にこれをクリアする様にします。
書き出しが自分なので解決しておきます。
編集 削除