Node.js将目录中的文件名与文本文件中的文件名进行比较

时间:2018-05-31 14:32:18

标签: node.js electron filenames

我有 txt文件,文件名列表应位于目录中。我还有一个目录,其中有很多文件。我需要删除目录中的所有文件,文件名不存在于txt文件中

让我举一个简单的例子来澄清我的问题: 我们有file.txt,其中包含以下内容:" a.pbo b.txt c.gif" 我们还有一个包含这些文件的文件夹(目录):a.pbo,b.txt,c.gif,d.png 作为" d.png"在file.txt中不存在,我们需要从文件夹(目录)中删除它。

我正在考虑使用for循环,浏览文件夹中的所有文件以及每次打开文件并搜索文件名,但我对node.js和电子框架并不完全陌生。我知道怎么做。

编辑: 链接到我的file.txt的确切内容及其评论结构。

1 个答案:

答案 0 :(得分:1)

您需要fs才能对您的系统执行操作 split方法允许您将文件名转换为文件名数组 - 因为它们似乎用空格分隔。
然后,filter列表中不是(= !includes)的文件名并将其删除(fs.unlinkSync

以下是您可以做的事情:

const fs = require('fs');

const FILENAME = 'youfilename.txt';
const DIRECTORY = '/path/to/yourDirectory';
const SEPARATOR = " ";

const content = fs.readFileSync(FILENAME, 'utf8');
const fileList = content.split(SEPARATOR);
const filesInDir = fs.readdirSync(DIRECTORY);
const filesToRemove = filesInDir.filter(fileName => !fileList.includes(fileName))

filesToRemove.forEach(fileName => fs.unlinkSync(fileName));

请注意,我使用Sync操作因为它更容易,否则您将不得不处理Promises或回调。 同步操作本质上较慢,但我认为在您的用例中它不会影响您的程序的性能。

编辑

我将上面的代码原样,并为您提供一段代码,可以将您的字符串转换为数组数组,然后只需调整代码。

var str = `Array
(
    [0] => .
    [1] => ..
    [2] => a.png
    [3] => logo.paa
    [4] => b.gif
    [5] => d.dll
    [6] => e.dll
    [7] => f.png
)
Array
(
    [0] => .
    [1] => ..
    [2] => text.txt
)
`;

var newStr = str
  .split('\n')
  .filter(s => s.trim() !== "Array" && s.trim() !== "(")
  .join("\n")
  .split(")")
  .map(s => s
    .split("\n")
    .map(s => s
      .trim()
      .split("=> ")[1]
    )
    .filter(n => n)
  )
  .filter(arr => arr.length > 0);

console.log(newStr);

regexp会更干净,但我喜欢String和Array方法,我发现它更容易理解。

希望它有所帮助,
最好的问候