Существует ли стандартный кроссплатформенный способ обработки и хранения относительных путей к файлам? - PullRequest
1 голос
/ 07 февраля 2012

Я пишу надстройку Firefox, которая хранит и открывает файлы, хранящиеся в базовом каталоге (каталог, который пользователь выбирает в качестве предпочтения).Я бы хотел, чтобы пользователю было проще скопировать этот каталог и перенести его на другой компьютер (возможно, переключение между OSX, Linux и Windows).

Первый способ, которым я решил сделать это, - это просто сохранитьчасть пути к файлу после базовой директории, и, если операционная система Windows, изменить все \ на /.Затем при использовании пути сохраненный путь объединяется с текущим базовым каталогом (после замены всех / на \, если операционная система Windows).

Это разумно или плохо?Если кто-то использовал \ в пути OSX (я думаю, что это возможно, но, возможно, эти косые черты - это какой-то другой символ, похожий на символ разделителя файлов \?), Это может привести к нежелательному поведению.Одна из альтернатив, о которой я подумал, - это использовать nsIFile и построить относительный путь, рекурсивно используя parent и leafName, чтобы выбрать каждое имя каталога и сохранить его в строку с чем-то вроде "" между ними, которую я затем мог бы заменить соответствующим разделителем пути.для операционной системы.Это кажется более надежным, чем мой первый метод, но, может быть, есть более простое, более стандартное решение?

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Вам не нужно изобретать собственное решение, есть nsILocalFile.getRelativeDescriptor().Пример:

var file1 = Components.classes["@mozilla.org/file/local;1"]
                      .createInstance(Components.interfaces.nsILocalFile);
file1.initWithPath("c:\\foo\\");

var file2 = Components.classes["@mozilla.org/file/local;1"]
                      .createInstance(Components.interfaces.nsILocalFile);
file2.initWithPath("c:\\foo\\bar\\test.txt");
alert(file2.getRelativeDescriptor(file1));

Этот код будет отображать bar/test.txt.Чтобы перейти от относительного дескриптора к используемому вами файлу setRelativeDescriptor():

file2.setRelativeDescriptor(file1, "bar/test.txt");
alert(file2.path);

Относительные дескрипторы являются кроссплатформенными, вы можете переместить каталог в другую ОС, и дескриптор не изменится.1012 *

0 голосов
/ 04 июня 2014

Я сталкивался с этим в своих поисках.Теперь есть новое решение.Это OS.File: https://developer.mozilla.org/en-US/docs/JavaScript_OS.File/OS.File_for_the_main_thread

...