如何在Windows上的Node.js中获取文件的大小写确切的path?

我有一个path,让我们说C:\temp\something.js ,我想在Windows上获得path的确切版本 – 所以如果有存储在磁盘上的C:\Temp\someThing.js ,我想得到这个值(path)。

如何从Node.js中的后一个path获得?

我已经通过FS API( https://nodejs.org/api/fs.html ),我还没有发现什么有用的(即fs.realpathSyncfs.statSyncfs.accessSync没有返回我所需要的)。

具有不区分大小写的文件系统(Windows,OSX)的平台令人惊讶地难以获得给定的,可能的情况变体路径的情况确切形式 – 似乎没有系统 API,所以诸如Node.js或Python,Perl,…)不是怪罪。

更新 : @barsh已经足够好了,可以打包下面的代码来和npm一起npm ,所以你可以很容易的安装它
npm install true-case-path

这个包含nocase选项glob npm包在这里 (尽管它需要在Windows上调整)。 基本上,将输入路径视为一个glob – 即使它是一个文字路径 – 使glob()返回存储在文件系统中的真实情况:

  • 在您的项目文件夹中安装包globnpm install glob (根据需要添加--save--save-dev )。

  • 使用下面的trueCasePathSync()函数 ; 请参阅使用和限制的评论; 值得注意的是,虽然输入路径也是标准化的,但支持 .. 开头的路径,因为path.normalize()不能解决它们相对于当前目录的问题。

    • 注意trueCasePathSync()不返回一个规范路径:如果你传入一个相对路径,你也会得到一个相对的输出路径,没有符号链接被解析。 如果您需要规范路径, fs.realPathSync()应用于结果。
  • 应该在Windows,OSX和Linux上工作 (尽管对区分大小写的文件系统的用处有限),使用Node.js v4.1.1

 /* SYNOPSIS trueCasePathSync(<fileSystemPath>) DESCRIPTION Given a possibly case-variant version of an existing filesystem path, returns the case-exact, normalized version as stored in the filesystem. Note: If the input path is a globbing *pattern* as defined by the 'glob' npm package (see prerequisites below), only the 1st match, if any, is returned. Only a literal input path guarantees an unambiguous result. If no matching path exists, undefined is returned. On case-SENSITIVE filesystems, a match will also be found, but if case variations of a given path exist, it is undefined which match is returned. PLATFORMS Windows, OSX, and Linux (though note the limitations with case-insensitive filesystems). LIMITATIONS - Paths starting with './' are acceptable, but paths starting with '../' are not - when in doubt, resolve with fs.realPathSync() first. An initial '.' and *interior* '..' instances are normalized, but a relative input path still results in a relative output path. If you want to ensure an absolute output path, apply fs.realPathSync() to the result. - On Windows, no attempt is made to case-correct the drive letter or UNC-share component of the path. - Unicode support: - Be sure to use UTF8 source-code files (with a BOM on Windows) - On OSX, the input path is automatically converted to NFD Unicode form to match how the filesystem stores names, but note that the result will invariably be NFD too (which makes no difference for ASCII-characters-only names). PREREQUISITES npm install glob # see https://www.npmjs.com/search?q=glob EXAMPLES trueCasePathSync('/users/guest') // OSX: -> '/Users/Guest' trueCasePathSync('c:\\users\\all users') // Windows: -> 'c:\Users\All Users' */ function trueCasePathSync(fsPath) { var glob = require('glob') var path = require('path') // Normalize the path so as to resolve . and .. components. // !! As of Node v4.1.1, a path starting with ../ is NOT resolved relative // !! to the current dir, and glob.sync() below then fails. // !! When in doubt, resolve with fs.realPathSync() *beforehand*. var fsPathNormalized = path.normalize(fsPath) // OSX: HFS+ stores filenames in NFD (decomposed normal form) Unicode format, // so we must ensure that the input path is in that format first. if (process.platform === 'darwin') fsPathNormalized = fsPathNormalized.normalize('NFD') // !! Windows: Curiously, the drive component mustn't be part of a glob, // !! otherwise glob.sync() will invariably match nothing. // !! Thus, we remove the drive component and instead pass it in as the 'cwd' // !! (working dir.) property below. var pathRoot = path.parse(fsPathNormalized).root var noDrivePath = fsPathNormalized.slice(Math.max(pathRoot.length - 1, 0)) // Perform case-insensitive globbing (on Windows, relative to the drive / // network share) and return the 1st match, if any. // Fortunately, glob() with nocase case-corrects the input even if it is // a *literal* path. return glob.sync(noDrivePath, { nocase: true, cwd: pathRoot })[0] }