В настоящее время я работаю над проектом Java, который должен позволить пользователю экспортировать проекты в комплекте с программным обеспечением Windows (.exe) или OS X app (.app), чтобы распространять данные на другие рабочие станции. Программное обеспечение Windows и OS X хранится как сжатый zip-файл и несжатый, если проект экспортируется. Моя проблема в том, что распаковка OS X-приложения на Windows нарушает символические ссылки внутри связанных фреймворков. Это, в свою очередь, нарушает подпись приложения и вызывает проблемы при запуске приложения в OS X.Работа с файлами символических ссылок unix на файловой системе Windows
Я использую библиотеки сжатия Apache Commons для распаковки пакетов, что позволяет мне обнаруживать символические ссылки и их цель. С OS X я могу воссоздать символическую ссылку с методами из java.nio.file.Files, но с Windows это потребует прав администратора, которые я немного не решаюсь добавить в качестве предварительного условия для использования программного обеспечения (даже если включено, я не уверен, что это сработает - не пробовал).
У меня есть небольшое понимание причины, по которой ссылки сломаны, но если я правильно понял, файловая система Windows не включает поддержку типа файла символической ссылки Unix, и, следовательно, ссылка распаковывается как обычный файл и больше не будет распознаваться как символическая ссылка при открытии на OS X.
Итак, мой вопрос заключается в том, что я могу как-то просто портировать файл символической ссылки в файловую систему Windows, сохраняя конкретные биты Unix или сохраняя эту информацию прямо невозможно? Или я должен просто изменить метод экспорта, чтобы добавить файлы проекта в существующий zip-файл, и в этом случае информация symlink, вероятно, будет сохранена до тех пор, пока zip не будет извлечен на целевой машине?
текущий код цикла по каждому ZipArchiveEntry
из ZipFile
, как показано ниже:
byte data[] = new byte[BUFFER];
Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
while (entries.hasMoreElements()) {
ZipArchiveEntry zipEntry = entries.nextElement();
String destFilename = copyFolder + zipEntry.getName();
File destFile = new File(destFilename);
if (zipEntry.isUnixSymlink()) {
File target = new File(zipFile.getUnixSymlink(zipEntry));
try {
// Try to create symbolic link - currently only works with OS X
Files.createSymbolicLink(destFile.toPath(), target.toPath());
continue;
} catch (Exception e) {
System.out.println("Failed to create symbolic link: " +
destFile.getAbsolutePath() + " -> " +
target.getAbsolutePath());
}
}
// If file
int count;
FileOutputStream fos = new FileOutputStream(destFile);
try (BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER)) {
InputStream is = zipFile.getInputStream(zipEntry);
while ((count = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
}
}
Не могли бы вы рассказать нам немного о рабочем процессе, в котором это используется (например, какое устройство представляет собой ZIP несжатый в Windows, и как это устройство переносится на Mac позже)? Я запутался, так как в Windows только файловая система NTFS поддерживает символические ссылки, а FAT32 этого не делает, поэтому, если вы распакуете ZIP на машине Windows на USB-ключ, если USB-ключ FAT отформатирован, символические ссылки будут потеряны. Если формат NTFS отформатирован, Mac (по умолчанию) не сможет его прочитать. Кроме того, каталоги могут быть символически привязаны любым пользователем, вам нужны только администраторы, которые используют symlink Files. – mihi
Кроме того, если вы скопируете файл/символическую ссылку в проводнике Windows, копия не будет привязана к символам, независимо от задействованных файловых систем (даже если NTFS для NTFS). – mihi
Текущий рабочий процесс следующий: 1) программное обеспечение для просмотра данных (OS X и версия для Windows) распаковывается до экспорта 2) экспортированные данные сохраняются рядом с программным обеспечением просмотра 3) все это снова сжимается в zip-файл и отправленных на FTP-сервер. Инструкции по загрузке пакета отправляются получателю по электронной почте И проблема: 4) Пользователь с OS X не может открыть программное обеспечение для просмотра, потому что приложение OS X сломалось во время процесса распаковки-> сжатия на окнах. – pnkkr