fstat

[機能]

  オープンされているファイルについての情報を得ます.成功すると,0 を返します.

[形式]
#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   ファイルサイズ(バイト単位)
		
[使用例]

  1. ファイルサイズ,ドライブ番号,最終変更時間の出力
    #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			
  2. ファイルのコピー
    #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;
    }
    			
[参照]

chmod, access, stat

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引