2009年03月11日

ファイル操作 その1?

ファイルの一覧を取得できたので次は個別のファイルについてみることにした。
使える関数を増やすのもいいけれど基本的に必然的な要因から詰めることにした。
今回はCの基本とも言えるopen,read,writeによるファイルコピーとaccess
OSよりのstat、utimesを扱った。
ファイルコピー部分はそもそもC言語の基本を知らなかったので理解のために使っただけで
ファイラーとか作らない限りはImageMagickなどで直接読み書きをすれば
使わないかもしれない。しかし今回一通り抑えたことで一般的なファイルストリームは
扱えるようになった事は大きい。なぜならUNIXはファイルとデバイスの区別が少ないからだ。
accessについてはopenやstatなど複数の命令を行うならば
openでファイルハンドルを取得しておいて
futimesやfstatを使う方がどう考えても効率が良さそうに感じた。

access関数はファイルの有無などを調べるものだが
もしもファイル確認後複数の命令を行うならばパスのパースコストを考えると
openでエラーを出す方法とどちらがいいともいえないと感じた。

statはファイル情報の取得ができ
utimesは時間が設定できる。

とちらもファイルハンドルに対して行う「f」がついたものと
シンボリックリンクを巡らない「l」がついたものがある。

utimesの他にutimeというのもあるようだがutimesの方が新しい命令の様だ。

ファイル関係のヘッダーは以下のとおり

#include <sys/file.h>//flock
#include <fcntl.h>//open =sys/fcntl.h
#include <unistd.h>//access
#include <sys/types.h>//stat
#include <sys/stat.h>//stat
#include <sys/time.h>//utimes


もしも時間を扱い易い形にするならばtime.hも必要となる。

ファイルハンドルはありがたくもint型で良いのだが
構造体としてはstatとtimevalという構造体を使うが宣言が面倒なので

typedef struct stat Stat;
typedef struct timeval Timeval;

と定義しておき


Stat f_info;
Timeval new_times[3]={{0,0},{0,0},{0,0}};

とstat用とutimes用の変数を宣言しておく
openでファイルディスクリプタ取得後であれば

result=fstat(fd,&f_info);

で取得できる。
新しく作ったファイルの日付を同一にしたければ
Timevalはtv_secとtv_nanosecがあるのだが
st_birthtime、st_atime、st_mtime、st_ctimeしかないので
st_birthtimeかst_atimeを全部に入れてやればいい。


new_times[0].tv_sec=f_info.st_atime;
new_times[1].tv_sec=f_info.st_atime;
new_times[2].tv_sec=f_info.st_atime;
result=futimes(w_fd, new_times);


これはどういう意味かというとデジカメでココログに転送するとき
exifの時間が反映されるのだがlibexifとか使って時間を取得してもいいが
exifの時間はファイルのタイムスタンプとほぼ同一とみられるので
一括処理の時、ImageMagickで加工したあとのファイルの日付をオリジナルと同じにしておくと
ファイラーでちょっとプロパティをみるだけで撮影時間がわかるということなのだ。

現在perlで

$mtime = (stat($_))[9];
utime($mtime,$mtime,$o_img);

としていることの代替を目指した。マクロにするか関数化して短くしたい感はある。
st_birthtimeを使っていないのは元ファイルがfatかfat32でbirthtimeはないだろうと思われるから

権限関係については目下急がないのでまだためしていないが
すでに取得しているので表示する事はできるはずだ。

すごく入門ぽいところばかりやっているわけだが
表示関連とhalがどうにかできたら
日本版限定だがthunarよりはましなファイラーができそうではある。
posted by Xo_ox at 23:25| Comment(0) | FreeBSDアプリ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。