2011-10-30 3 views
4

私はstructを定義するためにar.hを使用しています。私は、ファイルに関する情報を取得し、構造体の指定された変数に入れる方法について、私はどう思っていましたか?Cを使って "ls -la"と似たファイル情報を取得する方法は?

struct ar_hdr { 
    char ar_name[16];  /* name of this member */ 
    char ar_date[12];  /* file mtime */ 
    char ar_uid[6];   /* owner uid; printed as decimal */ 
    char ar_gid[6];   /* owner gid; printed as decimal */ 
    char ar_mode[8];  /* file mode, printed as octal */ 
    char ar_size[10];  /* file size, printed as decimal */ 
    char ar_fmag[2];  /* should contain ARFMAG */ 
}; 

私はls -la

-rw-rw----. 1 clean-unix upg40883 368 Oct 29 15:17 testar

からのファイルから情報を取得置くだろうか、上記で定義された構造体を使用していますか?

+0

ここで説明するように、lsの出力を得ることができます。http://stackoverflow.com/questions/646241/c-run-a -system-command-and-get-outputはそれを解析して構造体に値を設定します。 – lc2817

+0

http://stackoverflow.com/questions/857156/how-to-implement-unix-ls-l-command-in-c –

答えて

8

あなたが探しているのはstat(2,3p)です。

+0

あなたが正しいと思うのは、私が提案したものよりも適切な方法です。 – lc2817

+0

それはそれのように見えます。複数のファイルがある場合はどうすればいいですか?たとえば、このコマンドを実行します。 '%./foo file1 file2 file3'。これら3つのファイル情報をすべて取得することは可能ですか? unixで 'ar -q'コマンドをプログラムしようとしました。笑 – inoobdotcom

+0

さて、それは働いた。本当にありがとう。私もfstatを使いました。今すぐループするだけで、一度に複数のファイルを表示できるようになります。驚くばかり。任意の方法で、構造体を使用してアーカイブファイルに格納する方法を知っていますか?とにかく、あなたはとても役に立ちました。 – inoobdotcom

1

ls -laの動作をエミュレートするには、readdirstatの組み合わせが必要です。それらを使用する方法に関する情報を入手するにはman 3 readdirman 2 statを実行してください。

ls -laの出力をキャプチャすることは可能ですが、そのような考えはありません。 CやC++プログラムではなく、シェルスクリプトを期待している人もいます。 PythonやPerlで手助けできるのは間違ったことです。

利用可能なデータから自分で構造を構築する必要があります。 strftimeは、好きなように時間をフォーマットするために使用できます。

0

アーカイブヘッダーエントリに1つのファイルに関するデータを収集する場合、主な回答はstat()です。他のコンテキスト(ls -laなど)では、lstat()readlink()を使用する必要があります。 (注意してください:!readlink()は、その戻り文字列を終了ヌルされません)

ls -laで、あなたはおそらくディレクトリの内容を読み取るために(あまりにもreaddir()closedir()opendir()関数ファミリを使用します。

再帰的検索を処理する必要がある場合は、nftw()を見てください。 (ftw()もありませんが、nftw()を使用する方が良いでしょう)

関連する問題