Cでファイルの先頭からNバイトを削除することは可能ですか?
N は 30 バイトのみです。
ファイルが非常に大きい (場合によっては 100 GB) ため、ファイルをコピーできません。
ファイルの先頭から 30 バイトを削除することはできませんが、ファイルの上書きを止めるものは何もありません (少なくとも、ほとんどの Unix ファイルシステムでは)。これは、かかる時間の点でコピーに相当しますが、ディスクの空き容量を使い果たすことはありません。
十分にテストしていませんが、役立つかもしれない小さな機能を次に示します。
1 つの警告: 以前off_t
は 32 ビットの符号付き整数であったため、2GB を超えるファイルでは pread、pwrite、および ftruncate を使用できませんでした。Linux では、これはもはや当てはまりません。ただし、pread64、pwrite64、および ftruncate64 を使用する必要がある場合があります。お使いの OS で実際に動作することを確認するまで、関心のある非常に大きなファイルでこれを試さないでください。
int fshift(int fd, off_t to, off_t from) {
if (from <= to) {
fprintf(stderr, "%s\n", "Unimplemented: fshift can only shift left");
errno = ERANGE;
return -1;
}
char buffer[BUFFER_SIZE];
for (;;) {
ssize_t n_read = pread(fd, buffer, BUFFER_SIZE, from);
if (n_read < 0) {
int tmp = errno;
perror("fshift: could not read file");
errno = tmp;
return -1;
}
from += n_read;
if (n_read == 0) {
int rc = ftruncate(fd, to);
if (rc < 0) {
int tmp = errno;
perror("fshift: could not truncate file");
errno = tmp;
}
return rc;
}
for (char* p = buffer, *lim = &buffer[n_read]; p < lim;) {
ssize_t n_write = pwrite(fd, p, lim - p, to);
if (n_write < 0) {
int tmp = errno;
perror("fshift: could not write file");
errno = tmp;
return -1;
}
p += n_write;
to += n_write;
}
}
}