文件系统API

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) 异步版本已经废弃,目前只能用同步版本了。

原文地址:https://www.cnblogs.com/liuyinlei/p/6915504.html