Пара вопросов:1) Использует ли внутренняя структура папок символические ссылки для экономии места? (Под "внутренним" я подразумеваю, учитывая конкретную корневую папку, символические ссылки в этой корневой папке относятся только к другим файлам или каталогам, которые также находятся в этой папке?).
2) Как вы создаете архив .zip в OS X? (С помощью инструмента командной строки, и если да, то какой, или с помощью утилиты архивирования и т.д.)
3) Какую операционную систему использует целевой компьютер (где архив будет разархивирован), и какой метод вы используете, чтобы разархивировать файл там?
Прежде всего, в OS X символические ссылки - это в основном простые текстовые файлы с некоторой дополнительной информацией "Mac", которая позволяет OS X знать, что он должен обрабатывать файл как символическую ссылку. Эта дополнительная информация для Mac представляет собой специальный тип файла, код создателя и информацию о флаге Finder, которая хранится не в самом файле, а в каталоге диска HFS+.
В OS X, когда вы создаете файл .zip, в потоке zip нет места для этой дополнительной информации Mac, поэтому в некотором смысле символическая ссылка хранится в файле zip в виде простого файла. Может ли кто-то на другом Mac разархивировать архив и правильно ли он представить оригинальную структуру, зависит от того, кто или что вы используете для его разархивирования.
Например, около месяца назад компания выпустила игру поверх Steam, программного обеспечения Valve для распространения игр. В комплект игрового приложения входила библиотека Cid от NVIDIA в форме фреймворка, в котором внутренне используются символические ссылки. Первоначально была проблема со Steam, неправильно восстанавливающим необходимую информацию Mac на Trine.app, как упомянуто в этой теме:http://forums.steampowered.com/forums/showthread.php?t=1556083
На изображении ниже показаны 2 разные копии Cg.framework, одну я установил отдельно от веб-сайта NVIDIA (верхнее изображение), а нижнее изображение показывает, что было получено с игрой:
Обратите внимание, что все элементы совпадают, но символические ссылки должны быть простыми файлами данных.
После более внимательного изучения записи FSCatalogInfo для обоих элементов мне стало ясно, в чем проблема:
На верхнем изображении вы заметите, что начало структуры finderInfo имеет следующие значения:
0x736C6E6B = 'slnk'
0x72686170 = 'rhap'
Эти значения определены в /usr/include/hfs/hfs_format.h:
/*
* File type and creator for symbolic links
*/
enum {
kSymLinkFileType = 0x736C6E6B, /* 'slnk' */
kSymLinkCreator = 0x72686170 /* 'rhap' */
};
Девятое значение байта, 0x80, соответствует kIsAlias
объекта finderInfo.finderFlags
. Это значение определено в /System/Library/Frameworks/CoreServices.framework /.../CarbonCore.framework /.../Headers/Finder.h:
enum {
kIsAlias = 0x8000 /* Files only */
};
Похоже, что функция разархивирования, встроенная в OS X (Archive Utility), жестко запрограммирована для поиска возможных файлов в разархивированном архиве, которые представляют символические ссылки, и для установки информации соответствующим образом. Я считаю, что /usr/bin/ditto
(когда используется для его способности архивировать файлы) также позаботится об этом за вас. Я не уверен, что делать с zip
или unzip
.