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



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

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

我使用电子/节点.js

var 		 fs = require('fs'),
	jDataView = require('jdataview');
function filelist(directory){
	return fs.readdirSync(directory);
}
function trimNullChars(str){
	return str.replace(//g,'')
}
function readID3(file){
	var text = fs.readFileSync(file,'utf8');
	//console.log(text)
	var reader = new FileReader,
					dv = new jDataView(text);
	if (dv.getString(3, dv.byteLength - 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() );
	}
	var metadata = {
	 	artist : trimNullChars(artist) ,
	 	 album : trimNullChars(album)  ,
			year : trimNullChars(year)	 ,
		 title : trimNullChars(title)
	}
	return metadata
}
function toTXT(filename,data){
	if( !isStr(data) ){
		data = JSON.stringify(data);
	}
	// SAVE STRING
	fs.appendFile( filename, data + ',n', function(error){ if(error){console.log(error)} });
}
function crawlFiles(path){
	var files = filelist(path);
	var filepaths = [];
	files.forEach( (file) => {
		var fullname = '' + path + '/' + file + '';
		filepaths.push(fullname);
	});
	filepaths.forEach( fp => {
		var obj = readID3(fp);
		obj.filepath = fp;
		toTXT( './db2.js', obj );
	});
}

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

  • 使用Set对象创建缓存
  • 在将数据发送到toTXT函数之前,将数据字符串化。
  • 检查缓存中是否存在字符串化数据
    • 如果没有,请添加数据
    • 如果是这样,则什么都不做。

法典:

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 );
}
} );
}

旁白:

与其逐行读取/字符串化每个文件,然后逐行写入,我建议将所有数据串入一个Set对象(不允许重复(,然后将其一次性转储到文件中。这样可以节省处理和代码。

最新更新