#include <sys/types.h> #include <sys/stat.h> int fstat(int handle, struct stat *buf) handle : オープンされているファイルのハンドル buf : 結果を格納する構造体へのポインタであり,以下のメンバーから構 成されます. time_t st_atime 最終アクセス時間 time_t st_ctime 作成された時間 dev_t st_dev ドライブ番号 unsigned short st_mode ファイルモード time_t st_mtime 最終変更時間 short st_nlink 常に1 dev_t st_rdev ドライブ番号 off_t st_size ファイルサイズ(バイト単位)
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <time.h> int main() { double x1 = 10.5; long k1 = 21; int disk; char *buf; struct stat info; /* ディスクへの出力 */ disk = open("data", O_WRONLY|O_CREAT, S_IREAD); buf = (char *)(&x1); write(disk, buf, 8); buf = (char *)(&k1); write(disk, buf, 4); /* ファイル情報の出力 */ fstat(disk, &info); printf("File size : %ld\n", info.st_size); printf("Drive number : %d\n", info.st_dev); printf("Time modified : %s\n", ctime(&info.st_mtime)); close(disk); return 0; }
File size : 12 Drive number : 4839 Time modified : Wed Dec 22 13:21:52 1999
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/uio.h> #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> int main(int argc, char *argv[]) { long count; int source, target, ch; char *buf; struct stat filestat; if(argc < 3) { printf("***error use: test file1 file2\n"); exit(1); } /* ファイルのオープン */ if((source = open(argv[1], O_BINARY|O_RDONLY)) == -1) { printf("***error ファイル %s をオープンできません\n", argv[1]); exit(1); } target = open(argv[2], O_BINARY|O_WRONLY|O_CREAT|O_EXCL, S_IREAD|S_IWRITE); if (target == -1) { if(errno == EEXIST) { printf("Target exists. Overwrite? "); ch = getchar(); if((ch == 'y') || (ch == 'Y')) target = open(argv[2], O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE); } else { printf("***error ファイル %s をオープンできません\n", argv[2]); exit(1); } } /* バッファ領域の確保 */ fstat(source, &filestat); count = filestat.st_size; if((buf = (char *)malloc((size_t)count)) == NULL) { printf("***error no memory\n"); exit(1); } /* コピー */ if ((count = (long)read(source, buf, (int)count)) == -1) { printf("ファイルの読込に失敗しました\n"); exit(1); } if ((count = (long)write(target, buf, (int)count)) == -1) { printf("ファイルの書き込みに失敗しました\n"); exit(1); } /* ファイルのクローズと領域の開放 */ close(source); close(target); free(buf); printf("Copy successful\n"); return 0; }
菅沼ホーム | 本文目次 | 演習問題解答例 | 付録目次 | 索引 |