Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

sacndir()について。

385 views
Skip to first unread message

Hatat.K

unread,
Feb 4, 2002, 2:47:09 PM2/4/02
to
初めまして、羽田と言います。

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
==========================

red brick

unread,
Feb 6, 2002, 6:44:47 PM2/6/02
to
Hatat.Kさんの<3C5EE53D...@soleil.ocn.ne.jp>から

> 作成時間順でSORTさせたい場合は、何か他に関数が存在するので
> しょうか。又は、自作しろと言っているのでしょうか。

ターゲットの OS が Unix ならこのシステムコールが使えると思います。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fstat.2.html

--
red brick

松本 洋暁

unread,
Feb 6, 2002, 10:40:58 PM2/6/02
to
松本です.

"Hatat.K" <rivo...@soleil.ocn.ne.jp> writes:

> scandir(----,0);としたら"実現したい"結果になったもので、
> 確信を持っているわけではありません。

NULL が指定された場合はソートしないとなっているのでたまたま i node 順
になったのでしょう. 堅いアプリを作りたいなら指定した方がいいと思いま
す.

> 作成時間順でSORTさせたい場合は、何か他に関数が存在するので
> しょうか。又は、自作しろと言っているのでしょうか。

自作しろといってるように思います. alphasort 以外載っていませんでした.

# Solaris の man で確認しただけなので羽田さんの環境と違うかもしれませ
# ん. 引数も少し違うし.

--
======================//
Hiroaki Matsumoto // ze...@f5.dion.ne.jp
//======================

Hatat.K

unread,
Feb 5, 2002, 1:43:06 AM2/5/02
to
元記事の羽田です。

red brick さん、松本さん ご回答ありがとう御座いました。

松本 洋暁 (Hiroaki Matsumoto) wrote:

> 自作しろといってるように思います. alphasort 以外載っていませんでした.


やはりそうなんですね。考えてみます。

今後も、よろしくお願いします。

Takashi SHIRAI

unread,
Feb 7, 2002, 12:28:57 PM2/7/02
to
 しらいです。

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() の仕様は「自作しろ」と言っていると思いますが、そ
の目的が「作成時間順」である以上、冒頭で触れたとおり実現は不
可能だと思います。
 何か違うアプローチを模索してみて下さい。

--
しらい たかし

0 new messages