C言語の関数について、判らない事があり投稿致しました。
実現したい事:
・DIRECTRYに存在するファイル名を取得したい。
条件:ファイル名は、作成時間順で取得する。
試した事:
・scandir()を使用して、以下のように組んでみると
iノード順(作成時間順)で取得できました。
(確信が持てている訳ではありません。)
i=scandir(path,&namelist,0,0);
if(i < 0) { perror("scandir"); return(FALSE); }
while(j < i)
{ sprintf(buff,"%s/%s",path,namelist[j]->d_name);
stat(buff,&statbuf);
if(!S_ISDIR(statbuf.st_mode))
{ --------------- }
};j++;
動作環境:
・Laser5 7.1 deve版、Redhat 7.1J
(gcc 2.96, glib 2.2.4-19, postgresql 7.1.3, samba 2.0.10)
ここで、疑問が出てきました。
・"やりたい事"を実現させるために、各マニュアルのscandir()を
調べた結果、
------ アルファベット順のSORTとして
scandir(-------,alphasort); が使用可能とあります。
/usr/includeのヘッダを検索して見ましたが、alphasortのみ存在
しておりました。
scandir(----,0);としたら"実現したい"結果になったもので、
確信を持っているわけではありません。
ちなみに、#define scandir()で展開ソースを見てみようと
思っています。
作成時間順でSORTさせたい場合は、何か他に関数が存在するので
しょうか。又は、自作しろと言っているのでしょうか。
よろしければ、御教授して頂けないでしょうか。
==========================
リブワンネット
羽田国幸
rivo...@soleil.ocn.ne.jp
==========================
ターゲットの OS が Unix ならこのシステムコールが使えると思います。
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fstat.2.html
--
red brick
"Hatat.K" <rivo...@soleil.ocn.ne.jp> writes:
> scandir(----,0);としたら"実現したい"結果になったもので、
> 確信を持っているわけではありません。
NULL が指定された場合はソートしないとなっているのでたまたま i node 順
になったのでしょう. 堅いアプリを作りたいなら指定した方がいいと思いま
す.
> 作成時間順でSORTさせたい場合は、何か他に関数が存在するので
> しょうか。又は、自作しろと言っているのでしょうか。
自作しろといってるように思います. alphasort 以外載っていませんでした.
# Solaris の man で確認しただけなので羽田さんの環境と違うかもしれませ
# ん. 引数も少し違うし.
--
======================//
Hiroaki Matsumoto // ze...@f5.dion.ne.jp
//======================
red brick さん、松本さん ご回答ありがとう御座いました。
松本 洋暁 (Hiroaki Matsumoto) wrote:
> 自作しろといってるように思います. alphasort 以外載っていませんでした.
やはりそうなんですね。考えてみます。
今後も、よろしくお願いします。
In article <3C5EE53D...@soleil.ocn.ne.jp>,
Hatat.K <rivo...@soleil.ocn.ne.jp> wrote:
>初めまして、羽田と言います。
>C言語の関数について、判らない事があり投稿致しました。
C 言語というよりは UNIX の filesystem に依存する話なので、
fj.unix との cross post にして Followup-To: もそちらに指定し
ますね。
scandir() 自体は POSIX にもありませんが、scandir() が呼出
す opendir() や readdir() は POSIX にあって ANSI C にない関
数ですから。
>実現したい事:
> ・DIRECTRYに存在するファイル名を取得したい。
>
> 条件:ファイル名は、作成時間順で取得する。
一般的な UNIX の filesystem は、file の作成時間情報を持っ
てはいません。Windows で使われている filesystem では file 単
位で作成時間情報を持っているのですが。
UNIX の filesystem が持っている時間情報は、access time と
modification time 及び change time です。簡単に言うと、それ
ぞれ「最後に読んだ時間」「最後に書いた時間」「最後に属性変更
した時間」です。
これ以外の時間情報は、残念ながら一般的には取得出来ません。
> ・scandir()を使用して、以下のように組んでみると
> iノード順(作成時間順)で取得できました。
> (確信が持てている訳ではありません。)
i node 順が「作成時間順」であるというのがそもそもの誤解だ
と思います。
i node の番号順という意味ならば、「ls -i」の出力を見れば全
然的外れであることが確認出来ると思います。
ls の -i option は i node 番号を表示しますが、その番号の大
小が必ずしも作成順になっていないことは、複数の directory で
試行すれば確認出来ると思います。
また、各 directory の entry には i node 番号が格納されてい
ますが、その entry 順という意味ならば、「ls -f」の出力を見れ
ば誤解であることが確認出来ると思います。
ls の -f option は sort せずに entry 順のまま表示しますが、
/tmp や /var/tmp のように file の作成や削除が頻繁に行なわれ
ている directory で試行すれば entry 順がてんでバラバラになっ
ていることが確認出来ると思います。
どこか適当な directory で file の作成と削除を繰返しながら、
その都度 entry 順を確認してみて下さい。
この時の entry 順は OS や filesystem によってルールが異な
りますので、一体どういう規則性があるのかを探求してみるのも面
白いでしょう。
filename の長さを変えてみたり、directory file の sector 境
界に entry が来るように調整してみたりすると、一見デタラメに
見える中にある種の規則性が見えてくると思います。
特に、Linux の JFS や ReiserFS のように非 sequential 構成
の filesystem だと予想を裏切った挙動を見せてくれるのではない
でしょうか。
# こういう探求心が hacker への道の第一歩だと思う。
>動作環境:
>・Laser5 7.1 deve版、Redhat 7.1J
> (gcc 2.96, glib 2.2.4-19, postgresql 7.1.3, samba 2.0.10)
この際 PostgreSQL と Samba は関係ないでしょう :-)
> scandir(----,0);としたら"実現したい"結果になったもので、
> 確信を持っているわけではありません。
この場合、目的と結果が合致したのはたまたまに過ぎません。
> ちなみに、#define scandir()で展開ソースを見てみようと
> 思っています。
scandir() は readdir() を呼んでいるだけですので、比較関数
未指定時の並び方は readdir() の source を解析した方が理解し
易いでしょうね。
とは言え、source を紐解いていくと、結局 filesystem driver
の実装に辿り着くと思うので、解析はそう容易なことではないと思
います。
上で触れたように、まずは表面的に観測出来る事象から理解を深
めていった方が早道でしょうね。
> 作成時間順でSORTさせたい場合は、何か他に関数が存在するので
> しょうか。又は、自作しろと言っているのでしょうか。
scandir() の仕様は「自作しろ」と言っていると思いますが、そ
の目的が「作成時間順」である以上、冒頭で触れたとおり実現は不
可能だと思います。
何か違うアプローチを模索してみて下さい。
--
しらい たかし