1.fs.Stats 类
fs.Stats类的实例是记录一个文件的基本信息,该实例可以由fs.stat(path,callback)、fs.lstat(path,callback)和fs.fstat(fd,callback)获取,fd是文件描述符,可以通过fs.open来获取。
获取文件的大小:
var diskPath = './user/'+'5832323914'+ '/2018-01-25'; var filename= diskPath +'/_1_.json'; var fileStats = fs.statSync(filename); console.log("fileStats is",fileStats.size); //1
对这个文件通过fs.createWriteStream新建了流,这个文件的大小为0。
var writableStream = fs.createWriteStream(filename); var fileStats = fs.statSync(filename); console.log("fileStats is",fileStats.size);
即使是写入内容也为0:
var writableStream = fs.createWriteStream(filename); writableStream.write('xx'); writableStream.end(); writableStream.destroy(); var fileStats = fs.statSync(filename); console.log("fileStats is",fileStats.size); //0
解决方式:
setImmediate(function(){ var fileStats = fs.statSync(filename); console.log("fileStats is",fileStats.size); }); //2
2.buffer类
buffer也有长度,看代码:
var str = "5oiiiiiiii"; //<Buffer 35 6f 69 69 69 69 69 69 69 69> console.log(new Buffer(str)); //10 console.log(new Buffer(str).length); //7 console.log(Buffer.byteLength(str,'base64')); //5 console.log(Buffer.byteLength(str,'hex'));
3.读取文件,并且按照行进行处理
Mime.prototype.load = function(file) { this._loading = file; // Read file and split into lines var map = {}, content = fs.readFileSync(file, 'ascii'), lines = content.split(/[ ]+/); lines.forEach(function(line) { // Clean up whitespace/comments, and split into fields var fields = line.replace(/s*#.*|^s*|s*$/g, '').split(/s+/); map[fields.shift()] = fields; }); this.define(map); this._loading = null; };
4.nodejs读取数据库的一种写法
/*来源于express-session*/ MySQLStore.prototype.createDatabaseTable = function(cb) { debug_log('Creating sessions database table'); var fs = require('fs'); /**读取当前目录下上级目录中的schema.sql中sql语句*/ /** CREATE TABLE IF NOT EXISTS `sessions` ( `session_id` varchar(255) COLLATE utf8_bin NOT NULL, `expires` int(11) unsigned NOT NULL, `data` text, PRIMARY KEY (`session_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin */ fs.readFile(__dirname + '/../schema.sql', 'utf-8', function(error, sql) { if (error) { return cb(error); } // '??' 变成 ?? sql = sql.replace(/`[^`]+`/g, '??'); var params = [ this.options.schema.tableName, this.options.schema.columnNames.session_id, this.options.schema.columnNames.expires, this.options.schema.columnNames.data, this.options.schema.columnNames.session_id ]; //创建sessions表,有列session_id,expires,data this.connection.query(sql, params, function(error) { if (error) { debug_error('Failed to create sessions database table.'); debug_error(error); return cb && cb(error); } cb && cb(); }); }.bind(this)); };
5.fs.writeFile
异步地写入数据到文件,如果文件已经存在则替代文件。 data
可以是一个字符串或一个 buffer,可以拷贝图片。如:
request.get(option, function(err, response, body) { //option.url为图片的URL if (err) { throw new Exception("30101", "微信下载图片失败"); } else { //console.log("微信下载图片", filePath); //response.body在图片编码,可能是二进制,也可能是base64 fs.writeFile(filePath, response.body, { encoding: null }, function(err) {} } }
如果字符串要换行: str + ' ';即可
writeFile只能读取小文件,如果要读取大文件,需要用到fs.readStream。可以参考:https://www.cnblogs.com/fengmk2/archive/2011/08/16/2140460.html
6.验证文件存在
fs.existsSync(path) 异步版本已经废弃,目前只能用同步版本了。