Возможно ли создать копию на копии копии файла на устройстве iOS?

Мне нужно скопировать файл, который будет изменен позже на устройстве iOS. По соображениям производительности было бы здорово, если бы это работало с копированием на запись, т. Е. Файл на самом деле не дублировался, и только модифицированные блоки копии записывались позже.

Как отмечалось в комментариях, это, вероятно, должно поддерживаться файловой системой (HFS +?). Недостаточно ссылки, так как имя старого (A) и нового (B) файла укажет на один и тот же файл, и если я изменю A, B также изменится.

«Ленивая» копия также не помогла бы, так как при первой записи весь файл все равно нужно было бы скопировать.

Я думал больше о решении, подобном описанному @Hot Licks, которое начнется с A и B, используя те же блоки на диске, и когда я напишу в файл B, только сохраненные блоки будут сохранены на диске, а идентичные части в A и B используются одни и те же блоки на диске.

Возможно ли это на iOS?

С Уважением, Jochen

1
добавлено отредактировано
Просмотры: 2
nl ja de
Мне нравится узнать о новом дизайне/новых способах ведения дел. Мне просто интересно узнать, что является преимуществом copy-on-write в приложении на мобильном устройстве, работающем в песочнице?
добавлено автор Black Frog, источник
@aknew - «Копировать на запись» - это, я думаю, UNIXism. В основном, вы говорите, что копируете файл, а «новый» файл «появляется» в его каталоге, но на самом деле указатель файла указывает на старый файл. Затем, если вы пишете файл, на самом деле создается новая копия, в некоторых случаях по секторам, так что неизменные сектора «разделяются» с оригиналом. Для этого можно использовать различные трюки для отображения памяти. Berkley Unix и, я думаю, некоторые из VAX-систем делали это в той или иной степени. Не знаю о Linux.
добавлено автор Hot Licks, источник
Jochen - Я никогда не слышал, чтобы это было доступно на iOS, но, возможно, вы могли бы придумать что-то вроде того, что предлагает @Petesh.
добавлено автор Hot Licks, источник
Я не понимаю, что вам нужно, только один файл в разных вариантах? Если это попытается использовать hardlinks (метод NSFileManager - (BOOL) linkItemAtPath: (NSString *) srcPath toPath: (NSString *) ошибка dstPath: (NSError **)).
добавлено автор aknew, источник
@Hot Licks - первая часть (указатель на старый файл вместо копии) просто жесткая ссылка, но я не понимаю, как реализовать создание реальной копии при записи в новый файл (указатель). Я думаю, он будет реализован в файловой системе. Постскриптум Я бы искал ключевые слова «ленивая копия», а не «копировать при записи», но я все еще не уверен, что правильно понимаю Йохен
добавлено автор aknew, источник

1 ответы

Нет встроенного механизма для эффективной частичной копии файлов, но если вы копируете файл и вносите внутренние изменения в контент, то самым эффективным механизмом для использования является mmap. Вы отображаете файл в память и изменяете его на месте. Изменения автоматически записываются в файл без необходимости переписывать файл на куски.

#include 
#include 
#include 
#include 

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);

Обычные оговорки применяются при изменении общего ресурса.

0
добавлено