我尝试读取目录中所有文件的元数据,并将其和文件路径逐行保存到文件中。这行得通。
但是现在在我的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
对象(不允许重复(,然后将其一次性转储到文件中。这样可以节省处理和代码。