【问题标题】:How to resolve case-aware paths in node.js or io.js?如何解决 node.js 或 io.js 中区分大小写的路径?
【发布时间】:2015-05-04 21:56:15
【问题描述】:

虽然path.resolve (myPath) 将myPath 与cwd 解析,但有没有办法在Windows 上使用fs(.stat 等)获取区分大小写的路径?

文件系统上的实际路径大小写:

C:\\myProjectX\\aBc\\function.js

将 dir 更改为 c:\myprojectx,然后在 REPL 中:

process.chdir('c:\\MYprojectx\\abc')
console.log(process.cwd(), path.resolve('c:\\myprojectx\\abc'))

打印c:\\MYprojectx\\abc c:\\myprojectx\\abc.

可能类似于this answer 对.NET 的建议。请注意,同一线程上的另一个答案建议对SHGetFileInfo stuct 进行win32 API 调用,最终导致this solution。

这在生成具有相对路径的数据时会出现问题,这应该是跨平台共享的。

【问题讨论】:

  • Path.resolve 实际上并没有触及文件系统。 fs.realPath 是否适用于此?
  • NTFS 区分大小写,但是“Windows 应用程序中用于文件访问的 API 不区分大小写,这使得从应用程序的角度来看文件名不区分大小写。因此, 应用程序只能访问文件名只是大小写不同的文件之一,如果提供的文件名不明确,某些命令可能会失败。”来自Wikipedia。
  • @lxe, fs.realpath 也与大小写无关。 :(
  • 只维护实际路径和文件名,然后直接使用它们,避免诸如 path.resolve 之类的调用?没有?
  • @TimothyGu,是的,NTFS 区分大小写。甚至 FS_CASE_SENSITIVE(在 C/C++ 中)标志也会返回 true,这在我们创建规范路径(如手写解析函数)时并不重要,但当我们想要为某些 非凡的用例。我确信在 NTFS 低级 API 中有一种方法可以检索 node.js 或 io.js 可以使用的真实大小写。甚至 .NET 也没有针对这个问题的正统解决方案。

标签: windows node.js winapi filesystems io.js


【解决方案1】:

使用true-case-path

const trueCasePathSync = require('true-case-path')

trueCasePathSync('/users/guest') // OSX: -> '/Users/Guest'

trueCasePathSync('c:\\users\\all users') // Windows: -> 'c:\Users\All Users'

【讨论】:

    【解决方案2】:

    从 Node 9.2.0 开始,您可以使用 fs.realpath.native() 或 fs.realpathSync.native()

    const fs = require('fs');
    fs.realpathSync.native('c:\\users') // Windows10: C:\\Users
    fs.realpathSync.native('c:\\users\\all users') // Windows10: C:\\ProgramData 
    

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 2011-10-06
      • 2021-11-16
      • 2021-04-29
      相关资源
      最近更新 更多