【问题标题】:How do I change file extension with javascript如何使用 javascript 更改文件扩展名
【发布时间】:2011-08-22 15:12:07
【问题描述】:

有人知道在 Javascript 中更改文件扩展名的简单方法吗?

例如,我有一个带有“first.docx”的变量,但我需要将其更改为“first.html”。

【问题讨论】:

  • 这是作业还是什么?
  • 这不是家庭作业...问题是我是 Javascript 的新手,所以有些东西我不习惯 :) 但我需要完成一个解析器网络系统...它从 doc、docx、pdf、rtf 或 txt 转换为 html ...

标签: javascript programming-languages methods


【解决方案1】:

这将改变包含文件名的字符串;

let file = "first.docx";

file = file.substr(0, file.lastIndexOf(".")) + ".htm";

对于可能没有扩展的情况:

let pos = file.lastIndexOf(".");
file = file.substr(0, pos < 0 ? file.length : pos) + ".htm";

【讨论】:

  • 请注意,如果您在没有扩展名的文件名上使用它,则会出现边缘情况。
  • 如果我从不提供典型文件的网站下载,我将如何设置文件格式?它只是一个网址。即 r5---sn-uxa0n-t8gs.googlevideo.com/……D134213BA9465CB74DFD36CDE47BF.102638C4A9F3ACA357F79EE747DD5F49F1E0F0DE
  • 此代码用于从已知文件名获取现有扩展名,如果您没有文件名,您的问题会有所不同。也许提交一个新问题。
  • 这对于像foo.bar/qux 这样的路径会失败,即父目录名称中没有扩展名但点。请参阅my answer 以获取也可以处理这些情况的解决方案。
【解决方案2】:

在 Node.js 中:

// extension should include the dot, for example '.html'
function changeExtension(file, extension) {
  const basename = path.basename(file, path.extname(file))
  return path.join(path.dirname(file), basename + extension)
}

与公认的答案不同,这适用于边缘情况,例如文件没有扩展名并且其中一个父目录的名称中有一个点。

【讨论】:

    【解决方案3】:
    file = file.replace(/\.[^.]+$/, '.html');
    

    【讨论】:

    • 问题是:不知道输入文件有哪个扩展名
    • 如果文件名是“file.name.docx”怎么办?
    • @Juan - 你的评论更适合@Alex K 的回答。
    • @ChaosPandion:为什么?你能指点我一个链接,说我不应该评论另一个更好的答案吗?如果这是这里的一般规则,我将停止这样做。
    • 正则表达式就是金锤反模式 (sourcemaking.com/antipatterns/golden-hammer)
    【解决方案4】:

    我会用这个:

    path.format({ ...path.parse('/path/to/file.txt'), base: '', ext: '.md' })
    

    将"/path/to/file.txt" 更改为"/path/to/file.md"。

    【讨论】:

    • ^^ 应该被标记为正确答案,因为它让框架担心边缘情况。
    【解决方案5】:

    这可能不会得到很多支持,但我无法抗拒。

    此代码将处理文件可能还没有扩展名的边缘情况(在这种情况下它将添加它)。它使用"tilde trick"

    function changeExt (fileName, newExt) {
      var _tmp
      return fileName.substr(0, ~(_tmp = fileName.lastIndexOf('.')) ? _tmp : fileName.length) + '.' + newExt
    }
    

    已编辑:感谢@kylemit 提供了一个更好的要点,它使用相同的逻辑,但方式更简洁:

    function changeExt(fileName, newExt) {
      var pos = fileName.includes(".") ? fileName.lastIndexOf(".") : fileName.length
      var fileRoot = fileName.substr(0, pos)
      var output = `${fileRoot}.${newExt}`
      return output
    }
    
    console.log(changeExt("img.jpeg", "jpg"))             // img.jpg
    console.log(changeExt("img.name.jpeg", "jpg"))        // img.name.jpg
    console.log(changeExt("host", "csv"))                 // host.csv
    console.log(changeExt(".graphqlrc", "graphqlconfig")) // .graphqlconfig
    

    【讨论】:

    • 嘿 Merc,从 3 年前挖掘这个答案。这很聪明,但有点单行。我是否可以谦虚地建议替换这个处理相同边缘情况的ES6 version in gist,但更清晰一点
    • 不错的一个。我也讨厌oneliners:D
    【解决方案6】:

    path.parse("first.docx").name + ".html"

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:stackoverflow.com/help/how-to-answer。祝你好运?
    【解决方案7】:
    var file = "first.docx";
    file = file.split(".");
    file = file[0]+".html";
    

    【讨论】:

    • 这似乎是一种相当复杂的解决问题的方法。
    • 这并不复杂,拆分很容易理解,但它可能做的工作比你需要的要多。但是,此解决方案不考虑文件名中的句点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多