5

Cでファイルの先頭からNバイトを削除することは可能ですか?

N は 30 バイトのみです。

ファイルが非常に大きい (場合によっては 100 GB) ため、ファイルをコピーできません。

4

2 に答える 2

1

ファイルの先頭から 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;
    }
  }
}
于 2012-12-02T21:23:33.930 に答える