temp_file_sample.c

最終更新:2009/10/10

temp_file_sample.c

001: /* テンポラルファイルを作る例
002:  * コマンドライン引数で与えられた文字列をプレフィクスとするテンポラルファイルを作成し、
003:  * テンポラルファイルへの書き込み、テンポラルファイルからの読み出し、最後に削除を行うコード例。
004:  * ポイント:
005:  * (1)apr_file_mktemp によりテンポラルファイルのファイル名が一意なものになること
006:  * (2)apr_file_mktemp の第三引数を 0 にすることにより、CREATE/READ/WRITE/DELONCLOSE フラグが
007:  *       有効になることにより新規作成・読み・書き・クローズ時の削除が行われること
008:  * (3)apr_file_seek によりテンポラルファイルの先頭にファイルポインタを移動させること
009:  */
010: 
011: #include "apr_general.h"
012: #include "apr_file_io.h"
013: #include "apr_strings.h"
014: 
015: #include "mystab.h"
016: 
017: #define K_BUF_SIZE 1024
018: 
019: int apr_my_main (
020:   int ac
021:   , char **av
022:   , apr_file_t * astdin
023:   , apr_file_t * astdout
024:   , apr_file_t * astderr
025:   , apr_pool_t * pool
026: ) {
027:   int result = 1;
028:   apr_status_t rv;
029:   apr_file_t * fp = NULL;
030:   apr_off_t offset;
031:   char error_buf[256];
032:   char *buf;
033:   int len=0;
034:   int i;
035:   int sum1=0; /* テンポラルファイルへの書き込みバイト数のカウンタ */
036:   int sum2=0; /* テンポラルファイルからの読み出しバイト数のカウンタ */
037:   
038:   char *prefix=NULL;
039: 
040:   if (ac < 2) {
041:     apr_file_printf(astderr, "Usage: %s prefix\n", av[0]); /* 引数はテンポラルファイル名のプレフィクス */
042:     return 1; /* エラー終了 */
043:   }
044: 
045:   prefix = av[1];
046: 
047:   if (APR_SUCCESS != (rv = apr_file_mktemp(&fp, apr_pstrcat(pool, prefix, "XXXXXX", NULL), 0, pool))) {
048:     apr_file_printf(astderr, "ERROR: apr_file_mktemp: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf)));
049:     result = 0;
050:     goto K_FINALLY_;
051:   }
052: 
053:   buf = "This is a pen.\n";
054:   len = strlen(buf);
055:   for (i=0;i<100000;i++) { /* とりあえず10万回書き込む */
056:     apr_file_printf(fp, buf);
057:     sum1 += len;
058:   }
059:   
060:   /* テンポラルファイルの先頭にファイルポインタを移動する */
061:   offset = 0;
062:   if (APR_SUCCESS != (rv = apr_file_seek(fp, APR_SET, &offset))) {
063:     apr_file_printf(astderr, "ERROR: apr_file_seek: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf)));
064:     result = 0;
065:     goto K_FINALLY_;
066:   }
067: 
068:   /* バッファ領域をメモリプールから割り当て */
069:   buf = apr_palloc(pool, K_BUF_SIZE);
070:   len = K_BUF_SIZE;
071:   
072:   /* テンポラルファイルから読み出し、標準出力に表示する */
073:   while (APR_EOF != apr_file_eof(fp)) {
074:     if (APR_SUCCESS == apr_file_read(fp, buf, &len)) {
075:       sum2 += len;
076:       apr_file_write(astdout, buf, &len);
077:     }
078:     len = K_BUF_SIZE;
079:   }
080: 
081:   /* テンポラルファイルのファイル名の取得 */
082:   apr_file_name_get( &buf, fp);
083:   /* テンポラルファイルのファイル名の表示 */
084:   apr_file_printf(astdout, "temporal file=[%s]\n", buf);
085:   /* テンポラルファイルへの書き込みバイト数とテンポラルファイルからの読み出しバイト数 */
086:   apr_file_printf(astdout, "write [%d] bytes\nread  [%d] bytes\n", sum1, sum2);
087:   
088: 
089: K_FINALLY_:
090: 
091:   if (fp != NULL) {
092:     apr_file_close(fp);
093:     fp = NULL;
094:   }
095:   
096:   return result;
097: }
098: 
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)