【问题标题】:NODE.JS - how to handle a mix of OS and URL-style "paths" correctly?NODE.JS - 如何正确处理操作系统和 URL 样式“路径”的混合?
【发布时间】:2013-08-22 21:40:29
【问题描述】:

在我的 node.js 应用程序中,我有可以传递的函数

操作系统风格的路径,例如c:\my\docs\mydoc.doc(或 /usr/docs/mydoc.doc 或任何本地文件)

文件 URL,例如file://c:/my/docs/mydoc.doc(我不确定 '\'s in 的有效性??)

无论哪种方式,我都需要检查它们是否引用特定位置,该位置将始终作为本地操作系统样式路径存在,例如c:\mydata\directory\ 或 /usr/mydata/directory

显然,对于操作系统风格的路径,我可以将它们作为字符串进行比较——它们应该总是相同的(它们是用路径创建的)但 FILE:// URLS 不一定使用 path.sep,所以不会“字符串匹配”?

关于处理这个问题的最佳方法的任何建议(我个人很想用一个或多个斜线来打破一切,然后检查每一块??

【问题讨论】:

  • 签出路径 (nodejs.org/api/path.html)。这应该对你有帮助。
  • 我已经在使用 Path - 问题是它并不真正理解像 file:// 这样的 URL,并且分隔符不一定与操作系统匹配!?
  • 使用(在 Windows 下)一些 nodejs 代码(在 linux 下开发),我有时会在 same 文件路径中同时使用“/”和“\”!

标签: node.js path


【解决方案1】:

只需对字符串进行一些操作并检查以确保在纠正差异后它们是相同的:

var path = require('path');
var pathname = "\\usr\\home\\newbeb01\\Desktop\\testinput.txt";
var pathname2 = "file://usr/home/newbeb01/Desktop/testinput.txt"

if(PreparePathNameForComparing(pathname) == PreparePathNameForComparing(pathname2))
{   console.log("Same path");   }
else
{   console.log("Not the same path");   }

function PreparePathNameForComparing(pathname)
{
    var returnString = pathname;
    //try to find the file uri prefix, if there strip it off
    if(pathname.search("file://") != -1 || pathname.search("FILE://") != -1)
    {   returnString = pathname.substring(6, pathname.length);  }

    //now make all slashes the same
    if(path.sep === '\\')    //replace all '/' with '\\'
    {   returnString = returnString.replace(/\//g, '\\');   }
    else    //replace all '\\' with '/'
    {   returnString = returnString.replace(/\\/g, '/');    }

    return returnString;
}

我检查了 URI 路径名称指示符“file://”是否存在,如果存在,我将其从比较字符串中删除。然后我根据路径分隔符归一化节点路径模块会给我。这样它应该可以在 Linux 或 Windows 环境中工作。

【讨论】:

  • 这就是我的想法 - 唯一的问题是我不相信 file:// URL 不会有 '\' 甚至两者的混合(我我在这里只对 Chrome 很感兴趣,但我知道有些浏览器支持两者/混合)?因此,为什么我只想扔掉所有的分隔符并比较其余的!?
  • 如果你只是想让它们都一样,而不管可能出现一些疯狂的混合,你可以把它们全部替换为 ,或 " " 或类似的东西。您可以使用以下方法执行此操作: returnString = returnString(/[\\/]+/, ",");这将用 ',' 替换单数或多数中的所有 '\' 和 '/',因此您根本不必再担心它们了。只需在我的函数中使用该代码而不是 if else,您应该会得到您想要的。
  • 我接受了这个,因为它本质上包含正确的答案。我的另一个解决方案“利用”路径的功能 - 这是我正在使用的,但对于未来的访问者来说,解决方案是相同的 - 只需删除协议 (file://),然后将所有可能的斜杠更改为本地 path.sep.. .
【解决方案2】:

我将对此发表我自己的看法 - 因为它来自我从 Facebook 上的某个人那里得到的建议(不 - 真的!)并且它使用路径的方式可能不是为了 - 例如我不确定这是正确的“解决方案”——我不确定我没有利用路径。

Facebook 的提示是 path 实际上只是一个用于处理带有“/”和“\”分隔符的字符串的实用程序 - 它忽略了其他所有内容 - 根本不关心里面有什么。

在此基础上,我们可以使用

path.normalize(ourpath)

这会将所有分隔符转换为本地操作系统首选的分隔符 (path.sep)

这意味着它们将匹配我的操作系统风格的目录(也是用路径创建的),因此我可以比较它们 - 无需手动删除斜线...

例如

之前

file://awkward/use/of\\slashes\in/this/path

之后

file:\awkward\use\of\slashes\in\this\path (Windows)

file:/awkward/use/of/slashes/in/this/path (everywhere else)

在之前删除file://(或在之后删除file: + path.sep)= 本地操作系统样式路径!?

【讨论】:

  • 为我工作!这正是为什么所有内置节点函数都不关心像 C:\whatever\and/then/unix/slashes.txt 这样的路径的原因
猜你喜欢
  • 1970-01-01
  • 2012-06-06
  • 2010-09-12
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2021-09-22
相关资源
最近更新 更多