是否有一种标准的跨平台方式来处理和存储相对文件路径

Is there a standard, cross-platform way to handle and store relative file paths?

本文关键字:处理 方式 存储 路径 文件 相对 跨平台 标准 一种 是否      更新时间:2023-09-26

我正在编写一个Firefox插件,用于存储和打开存储在基本目录(用户首选的目录)中的文件。我想让用户更容易地复制该目录并将其移动到另一台计算机(可能在OSX、Linux和Windows之间切换)。

我想做这件事的第一种方法就是将文件路径的一部分存储在基本目录之后,如果操作系统是Windows,则将所有的更改为/s。然后,当使用路径时,存储的路径会连接到当前的基本目录上(如果操作系统是Windows,则在将所有/替换为''之后)。

这种做法合理还是不好?如果有人在OSX路径中使用了''(我认为这是可能的,但这些斜杠可能是其他看起来像文件分隔符''?的字符),这可能会导致不必要的行为。我想到的一个替代方案是使用nsIFile,通过递归地使用parent和leafName来挑选每个目录名,并将其保存到一个字符串中,中间有"之类的东西,然后我可以用操作系统的适当路径分隔符来替换它,从而构建相对路径。这似乎比我的第一种方法更稳健,但也许有一个更简单、更标准的解决方案?

您不需要发明自己的解决方案,有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);

相对描述符是跨平台的,你可以将目录移动到不同的操作系统,描述符不会改变。

我在搜索中发现了这个。现在有了一个新的解决方案。它是OS.File:https://developer.mozilla.org/en-US/docs/JavaScript_OS.File/OS.File_for_the_main_thread