如何使用JavaScript更改文件扩展名

61

有没有简单的方法可以在Javascript中更改文件扩展名?

例如,我有一个变量名为"first.docx",但我需要将其更改为"first.html"。

8个回答

97

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

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";

7
请注意,如果您在没有扩展名的文件名上使用此功能,则会出现一个特殊情况。 - hippietrail
如果我从一个没有提供典型文件的网站下载文件,我该如何设置文件格式呢?它只是一个url。例如:https://r5---sn-uxa0n-t8gs.googlevideo.com/videoplayback?ipbits=0&initcwndb…D134213BA9465CB74DFD36CDE47BF.102638C4A9F3ACA357F79EE747DD5F49F1E0F0DE - oldboy
1
这段代码用于从已知文件名中获取现有的扩展名,如果您没有文件名,则问题是不同的。也许需要提交一个新的问题。 - Alex K.
1
这种情况对于像 foo.bar/qux 这样的路径会失败,即父目录名称中没有扩展名但有点号。请参见我的答案,其中提供了一个可以处理这些情况的解决方案。 - emlai

35

我会使用这个:

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

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


9
应该将其标记为正确答案,因为它让框架担心边缘情况。 - Merkle Groot
1
为什么将基础路径设置为空字符串?如果我的文件路径以“../”开头,将基础路径设置为空字符串会出错。 - Eric Kim
@Eric Kim 它确实没有。 - mizkichan

33

在 Node.js 中:

path.join(path.dirname(file), path.basename(file, path.extname(file)) + '.md')

更易读的说法:

// 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)
}
与被接受的答案不同,此方法也适用于极端情况,例如文件没有扩展名且其中一个父目录的名称中含有点号。

18
file = file.replace(/\.[^.]+$/, '.html');

问题是:我不知道输入文件的扩展名是什么。 - Joseandro Luiz
1
如果文件名是“file.name.docx”会怎样? - Joseandro Luiz
@Juan - 你的评论更适合放在 @Alex K 的回答下面。 - ChaosPandion
2
@ChaosPandion:为什么?你能给我一个链接,说明我不应该在评论中说另一个答案更好吗?如果这是这里的一般规则,我会停止这样做。 - Ruan Mendes
1
正则表达式这么简单却使用了金槌反模式(http://sourcemaking.com/antipatterns/golden-hammer) - Visionary Software Solutions
1
@JuanMendes 除了点号上不必要的转义符之外,/.[^.]+$/ 这个解决方案对于这个问题来说是一个很好的解决方案。不确定为什么会有这么多抗议? - Eat at Joes

6

这可能不会得到很多赞,但我忍不住要分享一下。

这段代码将处理一个边缘情况,即文件可能没有扩展名(在这种情况下,它会添加扩展名)。它使用了“波浪线技巧”

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

修改:感谢@kylemit提供了一个更好的gist,使用相同的逻辑,但方式更加简洁明了:

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年前挖出这个答案。它很聪明,但是一行代码有点难懂。我谦虚地建议您用这个gist中的ES6版本替换它,它处理相同的边缘情况,但更加清晰易懂。 - KyleMit
不错。我也讨厌一行代码:D - Merc

2

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


2
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。您可以在帮助中心找到有关编写良好答案的更多信息:https://stackoverflow.com/help/how-to-answer。祝你好运! - nima

1

在JavaScript或Node.js中,没有特定的方法来设置文件扩展名,因此解决方案归结为修改字符串。

let file = 'test.txt';

function changeFileExtension(str,ext){
  return str.split('.')[0] + `.${ext}`;
}

console.log(changeFileExtension(file,'html'));


0
var file = "first.docx";
file = file.split(".");
file = file[0]+".html";

这似乎是一个相当复杂的解决问题的方式。 - ChaosPandion
9
这并不复杂,分割很容易理解,虽然它可能会比你需要的做更多的工作。然而这种解决方案没有考虑文件名中的句号。 - Ruan Mendes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接