使用JavaScript(Electron/node.js)检查文件中是否已存在一行

使用JavaScript(Electron/node.js)检查文件中是否已存在一行,javascript,node.js,file,electron,metadata,Javascript,Node.js,File,Electron,Metadata,我尝试读取目录中所有文件的元数据,并将其和文件路径逐行保存到文件中。这很有效 但是现在在我的toText()函数中,我想检查文件中是否已经存在一行。但我不知道怎么做 我使用Electron/node.js var fs=require('fs'), jDataView=require('jDataView'); 函数文件列表(目录){ 返回fs.readdirSync(目录); } 函数trimNullChars(str){ 返回str.replace(/\0/g'') } 函数readID3

我尝试读取目录中所有文件的元数据,并将其和文件路径逐行保存到文件中。这很有效

但是现在在我的
toText()
函数中,我想检查文件中是否已经存在一行。但我不知道怎么做

我使用Electron/node.js

var fs=require('fs'),
jDataView=require('jDataView');
函数文件列表(目录){
返回fs.readdirSync(目录);
}
函数trimNullChars(str){
返回str.replace(/\0/g'')
}
函数readID3(文件){
var text=fs.readFileSync(文件,'utf8');
//console.log(文本)
var reader=新文件读取器,
dv=新的jDataView(文本);
if(dv.getString(3,dv.bytellength-128)='TAG'){
var title=dv.getString(30,dv.tell()),
artist=dv.getString(30,dv.tell()),
album=dv.getString(30,dv.tell()),
year=dv.getString(4,dv.tell());
}
变量元数据={
艺术家:特里姆查尔斯(艺术家),
专辑:trimNullChars(专辑),
年份:年,
标题:trimNullChars(标题)
}
返回元数据
}
函数toText(文件名、数据){
如果(!isStr(数据)){
data=JSON.stringify(数据);
}
//保存字符串
fs.appendFile(文件名,数据+',\n',函数(错误){if(错误){console.log(错误)}});
}
函数爬网文件(路径){
var files=文件列表(路径);
var filepath=[];
files.forEach((文件)=>{
var fullname=''+path+'/'+file+'';
filepath.push(全名);
});
filepath.forEach(fp=>{
var obj=readID3(fp);
obj.filepath=fp;
toTXT('./db2.js',obj);
});

}
使用缓存保存已存储内容的列表。步骤很简单:

  • 使用
    Set
    对象创建缓存
  • 在将数据发送到
    toText
    函数之前,先对数据进行字符串化
  • 检查字符串化数据是否存在于缓存中
    • 如果没有,请添加数据
    • 如果有,什么也不做

代码:


旁白:
与逐行读取/串接每个文件,然后逐行写入不同,我建议将所有数据串接到
Set
对象中(不允许重复),然后立即将其转储到文件中。这将节省您的处理和代码。

如果该行已经存在,是否希望将其忽略?要检查文件中是否已经存在行,您需要在当前状态下重新读取该文件。根据它的大小,您可以使用readFileSync之类的工具将其全部加载到内存中,然后分析字符串,但如果它太大而无法加载到内存中,则需要使用readline或streams逐行处理它。您是否考虑过在写入数据之前将其存储并检查本地数据结构?@etarrowo您不需要做所有这些。一个简单的集合对象将允许您在第一次迭代时检查它。@zfrisch Yes如果它已经存在,则应该忽略它。@zfrisch Yes在这里使用对象进行记忆可能是最好的,但如果不可能,则需要进行后处理
function crawlFiles( path ) {
    var files = filelist( path );
    var filepaths = [];

    var cache = new Set();

    files.forEach( ( file ) => {
        var fullname = '' + path + '/' + file + '';
        filepaths.push( fullname );
    } );
    filepaths.forEach( fp => {
        var obj = readID3( fp );
        obj.filepath = fp;

        var data = JSON.stringify( obj );
        if ( !cache.has( data ) ) {
            cache.add( data );
            toTXT( './db2.js', obj );
        }

    } );
}