NodeJS - чтение файлов macOS .plist

У меня есть файл .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?

Вы пытались объявить «utf8» вместо «utf-8»?

Jayffe 10.08.2018 11:54

@Jayffe Я обнаружил, что не так - это был двоичный файл, поэтому мне нужно было найти способ преобразовать его в простой xml :)

Ancinek 10.08.2018 11:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
1 304
2

Ответы 2

Хорошо, нашел решение. Угадайте, что публикация в 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);

Другие вопросы по теме