我曾犯过将文件路径视为字符串的错误
作为一名开发者,你做的一些事情可能多年来都行之有效,但当你最意想不到的时候,它们却会反过来给你带来麻烦。你真希望在你职业生涯早期,有其他开发者能告诉你这些,这样你就不会犯同样的错误了。这篇文章就讲到了其中一件事,如果你正在阅读这篇文章,那就把它当作我的忠告吧。
文件路径看起来像字符串。它包含多个目录,可能还有一个带扩展名的文件名。目录和文件名之间用一个/字符分隔,结果看起来像这样:` <directory> /path/to/file<filename> <filename>`。因此,你可以像处理字符串一样处理它们,将它们连接或拼接起来,直到传递给另一个用于读取或写入文件的文件方法。这些是我几个月前的想法。现在我错了。
别忘了Windows
如果你像我一样有幸在 Mac 或 Linux 系统上进行开发,那么你可能读完上面的段落后并没有发现任何错误。如果你在 Windows 系统上进行开发,那么当你读到这个/字符时,你很可能会一边喝咖啡一边叹气。
当你像我一样多年来一直使用 Mac 并将程序部署到 Linux 环境时,很容易忘记Windows 使用的是反斜杠。当你开发一个需要在两种平台上运行的命令行工具时,发现自己犯了这个错误,那真是令人懊恼。create -twilio-function就是这样一个命令行工具,它经历了一系列的 修改,例如:
mkdir(path + '/' + dirName);
到
const path = require('path');
mkdir(path.join(pathName, dirName));
这样它才能在Windows系统上正常运行。
对于 Windows 用户,我深表歉意。对于其他用户,在使用 Node.js 时,`path.resolve`path模块是你的好帮手。path.join每当需要连接两条路径时,都可以使用它。此外,还可以了解一下其他实用工具,例如`path.resolve` path.relative,它可以返回从一个路径到另一个路径的相对路径;以及 ` path.resolve` path.normalize,它可以返回解析为类似 `/path/to/path/to/path` 或 `/path/to/path/to/path` 等路径段的路径.解析器..。
不必在意,它会根据你正在使用的系统path.sep返回一个/或一个,只需使用即可。\path.join
路径的行为与字符串不同。
我的第二个错误,这次是用 Ruby 编写的。这个错误更隐蔽一些,我的测试也没发现。你看,你可以使用Pathname类来创建路径片段,然后将它们连接起来。例如:
require "pathname"
path1 = Pathname.new("path")
path2 = Pathname.new("to")
path1 + path2
# => #<Pathname:path/to>
如您所见,Pathname对象有一个+用于连接路径的操作符,很像+连接字符串的操作符。实际上,它还可以处理字符串和路径的混合使用:
require "pathname"
path1 = Pathname.new("path")
path2 = "to"
path1 + path2
# => #<Pathname:path/to>
这一切看起来都很好,但反过来却行不通。
require "pathname"
path1 = "to"
path2 = Pathname.new("path")
path1 + path2
# => TypeError (no implicit conversion of Pathname into String)
像这样的错误提示意味着我们做错了什么,但这并不是我遇到的问题。不,我的问题在于我期望连接一个路径名和一个字符串,结果却连接了两个字符串。这个问题体现在我的 Rubygemjekyll-gzip中。你看,我当时试图用这行代码创建一个路径集合:
files = Dir.glob(dir + "**/*{#{extensions}}")
结果发现,在某些情况下,dir它实际上是一个字符串而不是路径名,而且不包含分隔符。因此,glob 查找的是 `/ "dirname **/*{#{extensions}}"path / to"dirname/** /*{#{extensions}}" ...
files = Dir.glob(File.join(dir, "**", "*{#{extensions}}"))
问题已修复。在这种情况下,File.join应使用这种方法来避免字符串处理过程中出现意外情况。
始终使用内置路径工具
无论你使用 Node.js、Ruby 还是其他任何语言,都不要将文件路径视为字符串。它们在不同的平台上表现不同,将路径和字符串混用可能会导致难以调试的错误。
使用标准库,省去很多麻烦。
文章来源:https://dev.to/philnash/mistakes-i-ve-made-treating-file-paths-as-strings-jnb