使用 Node.js 删除文件

Rom*_*dez 2 asynchronous file node.js async-await

我正在尝试删除一些文件,然后显示一条消息。

预期产出

File deleted

Folder Cleared!!!
Run Code Online (Sandbox Code Playgroud)

实际产量

Folder Cleared!!!

File deleted
Run Code Online (Sandbox Code Playgroud)

当前的代码是:

File deleted

Folder Cleared!!!
Run Code Online (Sandbox Code Playgroud)

你可以帮我吗?

Tha*_*you 6

根据我对你的问题的最初评论,你的代码有很多需要修复的地方 -

const { unlink } =
  require("fs").promises  // <-- fsPromises

function clearConverted() {
  const converted =
    glob.sync("./converted/*.mp4")

  if (converted.length === 0)
    return Promise.resolve([])

  const promises = 
    converted.map(v => unlink(v).then(_ => v))

  return Promise.all(promises)
}

clearConverted() // <-- returns a promise!
  .then(deletedFiles => console.log("done! deleted files:", deletedFiles))

// done! deleted files: ./converted/foo.mp4, ./converted/bar.mp4
Run Code Online (Sandbox Code Playgroud)

看看我们如何消除console.log函数的副作用?这允许我们的函数收集有意义的数据,例如文件名,并返回已删除文件的列表。因为console.log效果现在已经超出了我们的范围clearConverted,如果我们愿意的话,我们可以改变它。

例如,我们可以在一个不太冗长的程序中简单地显示已删除文件的数量 -

clearConverted()
  .then(deletedFiles =>
    console.log("done! deleted %d files.", deletedFiles.length)
  )

// done! deleted 9 files.
Run Code Online (Sandbox Code Playgroud)

我们还可以做得更多。现在一个明显的改进是创建clearConverted一个接受path作为参数的通用函数 -

function unlinkFiles (path = "") { // <-- generic name and path parameter
  const files =
    glob.sync(path)

  if (files.length === 0)
    return Promise.resolve([])
  else
    return Promise.all(files.map(f => unlink(f).then(_ => f)))
}

unlinkFiles("./converted/*.mp4") // <-- supply path at call site
  .then(deletedFiles => console.log("done! deleted files:", deletedFiles))
  .catch(console.error) // <-- don't forget to catch Promises too
Run Code Online (Sandbox Code Playgroud)

现代功能async让我们可以跳过一些围绕 Promise 的仪式 -

async function unlinkFiles (path = "") { // <-- async keyword
  const files =
    glob.sync(path)

  return files.length === 0
     ? []  // <-- automatically wrapped in a Promise
     : Promise.all(files.map(f => unlink(f).then(_ => f)))
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您愿意,您可以使该函数接受glob结果而不是path-

const unlinkFiles = async (files = []) => // <-- arrow function
  files.length === 0
    ? []
    : Promise.all(files.map(f => unlink(f).then(_ => f)))

unlinkFiles(glob.sync("./converted/*.mp4")) // <-- use glob as input
  .then(console.log, console.error)
Run Code Online (Sandbox Code Playgroud)

当您理清电线时,编程就会变得有趣简单。可悲的是,像 JavaScript 这样的语言也很容易搬起石头砸自己的脚,所以在启蒙之前有很多痛苦。


我还有涉及模块和承诺的其他答案fs。这些额外的代码示例可能有助于提供额外的见解 -