この関数を知るまで(私は)ファイルをコピーする処理を途中までで止めるという様な事をしていました。
$ man truncate とすると、以下の様な説明が出ます。
TRUNCATE(2) Linux Programmer's Manual TRUNCATE(2)
名前
truncate, ftruncate - 指定した長さにファイルを切り詰める
書式
#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
説明
truncate() は path で指定されるファイルを、 ftruncate() は fd で参照さ
れるファイルを length バイトの長さになるように延長する、もしくは切り詰
める。もし切り詰める前のファイルが length より長ければ、length バイトを
越える部分のデータは失われる。もし切り詰める前のファイルが length より
短かければ、伸張される。伸張された部分を読んだ場合は NULL バイト ('\0')
の列が返される。
ファイルオフセットは変更されない。
大きさが変更されると、ファイルの st_ctime と st_mtime フィールド (それ
ぞれ最終状態変更時刻、最終修正時刻; stat(2) 参照) が更新される。ま
た、set-user-ID と set-group-ID の許可ビットがクリアされるかもしれな
い。
ftruncate() の場合、ファイルは書き込み用に開いていなければならない。
truncate() の場合、ファイルは書き込み可能でなければならない。
(以下略)
サンプルソースコードを以下にあげておきます(空行入れても39行という小さなプログラムです)。
これは、ファイルの末尾が 0x0a だったらそれを切り詰めるというものです。
このプログラムは、qtorrent を使っている頃に作ったものです。#include <stdio.h>
int main(int ac, char *av[] ) {
FILE *fp;
int fsr;
long fsz;
char c1;
int rv=0;
if (ac<2) {printf("対象ファイルを指定してください\n"); return 1;}
fp=fopen(av[1],"r+");
if (NULL==fp) {printf("The file is not found(%s).\n",av[1]);return 1;}
fsr=fseek(fp, -1 , SEEK_END);
if (fsr != 0) {
printf("seek error %d\n",fsr);
fclose(fp);
rv=2;
}else{
c1=fgetc(fp); printf("tail=%02x ",c1);
if (c1==0xa) {
fsz=ftell(fp);
fsr=fseek(fp, -1 , SEEK_END); if (fsr!=0) printf(" seek=%d ",fsr);
fsz=ftell(fp);
fclose(fp);
fsr=truncate(av[1],fsz);
printf("cut\n");
} else printf("skip\n");
}
return rv;
}
torrentファイルの末尾に 0x0a があると qtorrent が torrentファイル不正とみなして動かなかったので。
rtorrent では、0x0a がくっついていても関係ないようで、このプログラムの出番は無くなりました。
今見直すと、
の部分は、f 付きの ftruncate にしてfclose(fp);
fsr=truncate(av[1],fsz);
とする方が美しいですね。fsr=ftruncate(fp,fsz);
fclose(fp);
man で示される includeファイルではなくて、stdio.h だけを include していますが(私の環境では)コンパイルできています。
上記サンプルソースは無保証です。利用は自己責任でお願いします。

前の(今日に近い)記事 ← | 最新記事 | 【全目次】 | → 次(過去)の記事