1

後で iOS デバイスで変更されるファイルをコピーする必要があります。パフォーマンス上の理由から、これがコピー オン ライトで動作する場合、つまり、ファイルが実際には複製されず、コピーの変更されたブロックのみが後で書き込まれるとよいでしょう。

コメントで指摘されているように、これはおそらくファイル システム (HFS+?) でサポートされている必要があります。古い (A) ファイル名と新しい (B) ファイル名の両方が同じファイルを指し、A を変更すると B も変更されるため、リンクだけでは不十分です。

最初の書き込みでファイル全体をコピーする必要があるため、「怠惰な」コピーも役に立ちません。

ディスク上の同じブロックを使用して A と B で始まる @Hot Licks で説明されているようなソリューションについてもっと考えていました。ファイル B に書き込むと、変更されたブロックのみがディスクに保存され、同一の部分が保存されます。 A と B では、ディスク上の同じブロックを使用し続けます。

これはiOSで可能ですか?

よろしく、ヨッヘン

4

1 に答える 1

0

ファイルの部分コピーを効率的に行う組み込みのメカニズムはありませんが、ファイルをコピーして内容に内部的な変更を加える場合、使用する最も効率的なメカニズムは mmap です。ファイルをメモリにマップし、その場で変更します。変更は、ファイルを細かく書き直す必要なく、自動的にファイルに書き戻されます。

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>

struct stat astat;
int fd = open("filename", O_RDWR);
if ((fd != -1) && (fstat(fd, &astat) != -1)) {
    char *data = mmap(0, astat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (data != MAP_FAILED) {
        self.data_ptr = data;
        self.data_size = astat.st_size;
    }
    close(fd);
}

ファイルの処理が完了したら、munmap を使用してマッピングを os に解放します。

munmap(self.data_ptr, self.data_size);

共有リソースの変更には、通常の警告が適用されます。

于 2013-01-09T15:35:15.950 に答える