Intereting Posts
Как упаковать структуру в Visual Studio до 24 бит, содержащей uint32_t? Преобразование float в int (float2int) с использованием только побитовой манипуляции C: добавление элемента в динамически распределенный массив Освобождение памяти, которая была выделена массиву указателей на символы (строки). Нужно ли мне освобождать каждую строку или просто «главный» указатель? Как я могу ограничить память, полученную с помощью `malloc ()` без ограничения стека? Как написать барьер памяти для DSP TMS320F2812? Почему `x-> 0` не является неопределенным поведением, а` x = x – `is? Проверьте, является ли символ пробелом undefined symbol _main в модуле c0.ASM Сколько можно создавать поддельные функции с макросами в C? Ожидаемое выражение перед … В заявлении Switch fgets () включает в себя новую строку в строке Недопустимое чтение / запись размера 8 2 Выделение в функции, непригодное в основном Подождите всего 5 секунд для ввода пользователем

Как создать разреженный файл программно, на C, в Mac OS X?

Я хотел бы создать разреженный файл таким образом, чтобы все нулевые блоки не занимали фактическое дисковое пространство, пока я не напишу данные им. Является ли это возможным?

Как и в других Unix, это особенность файловой системы. Либо файловая система поддерживает его для ВСЕХ файлов, либо нет. В отличие от Win32, вам не нужно ничего делать, чтобы это произошло. Кроме того, в отличие от Win32, для использования разреженного файла нет штрафа за производительность.

В MacOS файловая система по умолчанию – HFS +, которая не поддерживает разреженные файлы.

Обновление: MacOS используется для поддержки томов UFS с разреженной поддержкой файлов, но это было удалено. Ни одна из поддерживаемых в настоящее время файловых систем не поддерживает разрешенные файлы.

Кажется, есть некоторая путаница относительно того, поддерживает ли файловая система Mac OS X по умолчанию (HFS +) отверстия в файлах. Следующая программа демонстрирует, что это не так.

#include  #include  #include  #include  void create_file_with_hole(void) { int fd = open("file.hole", O_WRONLY|O_TRUNC|O_CREAT, 0600); write(fd, "Hello", 5); lseek(fd, 99988, SEEK_CUR); // Make a hole write(fd, "Goodbye", 7); close(fd); } void create_file_without_hole(void) { int fd = open("file.nohole", O_WRONLY|O_TRUNC|O_CREAT, 0600); write(fd, "Hello", 5); char buf[99988]; memset(buf, 'a', 99988); write(fd, buf, 99988); // Write lots of bytes write(fd, "Goodbye", 7); close(fd); } int main() { create_file_with_hole(); create_file_without_hole(); return 0; } 

Программа создает два файла длиной 100 000 байт, один из которых имеет отверстие 99,988 байт.

В Mac OS X 10.5 на разделе HFS + оба файла занимают одинаковое количество блоков диска (200):

 $ ls -ls total 400 200 -rw------- 1 user staff 100000 Oct 10 13:48 file.hole 200 -rw------- 1 user staff 100000 Oct 10 13:48 file.nohole 

В то время как на CentOS 5 файл без отверстий потребляет 88 дополнительных блоков диска, чем другой:

 $ ls -ls total 136 24 -rw------- 1 user nobody 100000 Oct 10 13:46 file.hole 112 -rw------- 1 user nobody 100000 Oct 10 13:46 file.nohole 

Этот stream становится исчерпывающим источником информации о разреженных файлах. Вот недостающая часть для Win32:

Достойная статья с примерами

Инструмент, который оценивает, имеет ли смысл делать файл столь же редким

С уважением

hdiutil может обрабатывать разреженные изображения и файлы, но, к сожалению, структура, с которой она связана, является частной.

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

cristi: ~ diciu $ otool -L / usr / bin / hdiutil

/ usr / bin / hdiutil: /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages (версия совместимости 1.0.8, текущая версия 194.0.0) [..]

cristi: ~ diciu $ nm /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages | awk -F ” ‘{print $ 3}’ | c ++ filter | grep -i редкий

[..]

CSparseFile :: сектор2Band (длинный длинный)

CSparseFile :: addIndexNode ()

CSparseFile :: readIndexNode (long long, SparseFileIndexNode *)

CSparseFile :: readHeaderNode (CBackingStore *, SparseFileHeaderNode *, unsigned long)

[… сокращение для краткости]

Позднее Редактировать

Вы можете использовать hdiutil в качестве внешнего процесса и создать для него разреженный образ диска. Из процесса C вы затем создадите файл в (смонтированном) разреженном образе диска.

Если вы хотите переносимости, в последнюю очередь нужно написать свою собственную функцию доступа, чтобы вы управляли индексом и набором блоков.

В сущности, вы управляете одним файлом, поскольку ОС управляет диском, сохраняя цепочку блоков, которые являются частью файла, bitmap выделенных / свободных блоков и т. Д.

Конечно, это приведет к не оптимизированному и более медленному доступу, я бы рекомендовал этот экзамен только в том случае, если требование экономии места абсолютно критично, и у вас есть достаточно времени, чтобы написать надежный набор функций доступа.

И даже в этом случае я бы сначала исследовал, нуждается ли ваша проблема в другом решении. Вероятно, вы должны хранить свои данные по-другому?

Если вы ищете (fseek, ftruncate, …) до конца, размер файла будет увеличен без выделения блоков до тех пор, пока вы не напишите в отверстия. Но нет никакого способа создать волшебный файл, который автоматически преобразует блоки нhive в отверстия. Вы должны сделать это сами.

Это может быть полезно посмотреть (команда OpenBSD cp вставляет отверстия вместо записи нhive). пластырь

Похоже, OS X поддерживает разреженные файлы на томах UDF. Я попробовал тестовую программу titaniumdecoy на OS X 10.9, и она создала разреженный файл на образ диска UDF. Кроме того, не то, что UFS больше не поддерживается в OS X, поэтому, если вам нужны разреженные файлы, UDF – единственная поддерживаемая ими файловая система, поддерживающая их.

Я также пробовал программу по акциям SMB. Когда сервер Ubuntu (файловая система ext4), программа создает разреженный файл, но «ls -ls» через SMB этого не показывает. Если вы делаете «ls -ls» на самом узле Ubuntu, он показывает, что файл разрежен. Когда на сервере находится Windows XP (файловая система NTFS), программа не генерирует разреженный файл.