У меня есть файл .plist на моем Mac, который я хотел бы прочитать. Я легко могу открыть его с помощью Xcode, но хотел бы сделать это с помощью NodeJS.
Я нашел пакет plist и пытаюсь использовать его вот так:
import fs from 'fs';
import plist from 'plist';
fs.readFile('/my/path/here.plist', 'utf-8', (err, data) => {
console.info('#data', data);
const obj = plist.parse(data);
console.info('#obj', obj);
});
То, что я получаю от data, выглядит так (часть этого файла)
dataYdisplayasZfile-label]file-mod-date[arrangement_preferreditemsize��- O(book(0$Usersnyc Downloads �i(� +� HXhA���L� file:///Macintosh
Пакет plist выдает ошибки, поскольку я предполагаю, что он ожидает строку в формате XML.
Как я могу прочитать такой файл .plist?
@Jayffe Я обнаружил, что не так - это был двоичный файл, поэтому мне нужно было найти способ преобразовать его в простой xml :)





Хорошо, нашел решение. Угадайте, что публикация в SO дает мне больше удачи в поиске в Google ...
Файлы macOS .plist в основном находятся в двоичном формате. Существует команда plutil, которая позволяет преобразовать двоичный файл в xml, поэтому для этого в узле вам необходимо:
import { exec } from 'child_process';
const command = 'plutil -convert xml1 ./path/to/binary/file.plist';
exec(command, callback); // Here you gonna convert this file to plain `xml`.
Затем вам просто нужно повторить мои шаги сверху - прочитать файл с помощью fs.readFile, а затем преобразовать его с помощью пакета plist, чтобы получить хороший объект JS.
Надеюсь, это кому-то поможет!
Я бы рекомендовал использовать соответствующую библиотеку, такую как bplist-парсер (только для чтения) или простой лист (чтение-запись, обертывает bplist-parser и bplist-creator, а также обрабатывает простой текстовый список) вместо использования модуля child_process. Не забывайте, что exec требует особого ухода (например, избегание аргументов), и с его помощью легко выстрелить себе в ногу!
import { parseFile } from 'bplist-parser';
parseFile('./path/to/binary/file.plist', callback);
Вы пытались объявить «utf8» вместо «utf-8»?