Nodejs小知识

您所在的位置:网站首页 nodejs获取文件路径 Nodejs小知识

Nodejs小知识

2023-02-28 15:41| 来源: 网络整理| 查看: 265

一、背景 前些日子推动组内前端项目自研上云,造了一个轮子上传文件至CDN(没错造了一下轮子),整个逻辑很简单,就是递归遍历文件加上传,但是在路径拼接这个过程踩了一个小坑。二、原因

日常习惯了Mac OS,很少接触 win,近日组内同学使用win突然发现上传的路径分隔符变成了\,并且上传至COS后按目标路径无法正常访问。

针对这个问题,去 COS上查了一下,发现文件名变为了 xxx\xxx.xx,经过排查发现,对于同样路径下的文件""

POSIX 下:/client/test/a.txt

Windows 下:\client\test\a.txt, encode之后变为: %5Cclient%5Ctest%5Ca.txt

看来是分隔符的问题导致系统未匹配正确,将路径当成文件名进行了保存。

三、解决方案

带着疑惑,首先查一下为何windows下的路径分隔符为\,推荐一篇知乎上我觉得比较好的答案吧:

Windows 用反斜杠(“\”)的历史来自 DOS,而 DOS 的另一个传统是用斜杠(“/”)表示命令行参数,比如: cd %SystemDrive% dir /s /b shell32.dll

既然 DOS 这边斜杠被占用了,只好找一个最接近的。那就是它了。而在 UNIX 环境中,我们用减号(“-”)和双减号(“--”)表示命令行参数。 用斜杠表示命令行参数是兼容性原因。这个问题最初起源自 IBM。IBM 在最初加入 DOS 开发时贡献了大批工具,它们都是用斜杠处理命令行参数的。而这个传统源自于 DEC/IBM,比如当年的 VMS 就是用斜杠处理命令行参数,它的目录分隔符是美元符(“$”)。顺便说一句,这个传统也被部分地继承进了 DOS 和 Windows 体系,日文版的 Windows 就把反斜杠在屏幕上显示为“¥”,虽然实际上还是反斜杠。 如今的 Windows 内核在处理路径时确实可以同时支持斜杠和反斜杠。很多时候我们看到用斜杠时出错,是因为应用程序层面的原因。比如 cmd.exe 就不支持用斜杠表示路径,而PowerShell.exe 支持,也正因为这个原因,PowerShell 开始转而使用减号作为命令行参数的起始符。

总而言之就是「历史问题」,那么在Node下,我们有没有什么好的方案来兼容这个问题呢?

查阅了一下官方文档,有如下说明:

The default operation of the path module varies based on the operating system on which a Node.js application is running. Specifically, when running on a Windows operating system, the path module will assume that Windows-style paths are being used.

可以看到在Node下默认的路径是与操作系统保持一致的,因此出现了 \。

为了要获取到符合 / 格式的路径,我们可以使用 PATH 模块提供的 path.sep 接口进行字符串匹配截取,接口会根据系统环境的不同进行匹配截取。

在 Unix 系统下

foo/bar/baz'.split(path.sep); // Returns: ['foo', 'bar', 'baz']

Windows 系统下

foo\\bar\\baz'.split(path.sep); // Returns: ['foo', 'bar', 'baz']

其实实际上通过源码

发现,path.sep 的赋值也是根据操作系统来决定是 / 还是 \

四、总结

最终的方案自然是 string.split(path.sep).join('/') 来进行分隔符的替换。

涉及的知识点有:

分隔符不同操作系统采用方案历史背景介绍Nodejs 官方说明及API介绍(在这之前我是不知道path.sep这个API的)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3