第6筆記 nodejs 文件系統(tǒng)-2

文件系統(tǒng)模塊是一個封裝了標準的 POSIX 文件 I/O 操作的集合。通過require('fs')使用這個模塊。所有的方法都有同步和異步兩種模式卦方。

異步方法最后一個參數(shù)都是回調(diào)函數(shù)召庞,這個回調(diào)的參數(shù)取決于方法当船,不過第一個參數(shù)一般都是異常破镰。如果操作成功,那么第一個參數(shù)就是null或undefined压储。

當使用一個同步操作的時候鲜漩,任意的異常都立即拋出,可以用 try/catch 來處理異常集惋,使得程序正常運行孕似。

這是異步操作的例子:

var fs = require('fs');

fs.unlink('/tmp/hello', function (err) {

if (err) throw err;

console.log('successfully deleted /tmp/hello');

});

這是同步操作的例子:

var fs = require('fs');

fs.unlinkSync('/tmp/hello');

console.log('successfully deleted /tmp/hello');

異步方法不能保證操作順序,因此下面的例子很容易出錯:

fs.rename('/tmp/hello', '/tmp/world', function (err) {

if (err) throw err;

console.log('renamed complete');

});

fs.stat('/tmp/world', function (err, stats) {

if (err) throw err;

console.log('stats: ' + JSON.stringify(stats));

});

可能先執(zhí)行了fs.stat方法刮刑。正確的方法:

fs.rename('/tmp/hello', '/tmp/world', function (err) {

if (err) throw err;

fs.stat('/tmp/world', function (err, stats) {

if (err) throw err;

console.log('stats: ' + JSON.stringify(stats));

});

});

在繁忙的進程里喉祭,強烈建議使用異步方法养渴。同步方法會阻塞整個進程,直到方法完成泛烙。

可能會用到相對路徑理卑,路徑是相對process.cwd()來說的。

大部分 fs 函數(shù)會忽略回調(diào)參數(shù)蔽氨,如果忽略藐唠,將會用默認函數(shù)拋出異常。如果想得到原調(diào)用點的堆棧信息鹉究,需要設置環(huán)境變量 NODE_DEBUG宇立;

$ cat script.js

function bad() {

require('fs').readFile('/');

}

bad();

$ env NODE_DEBUG=fs node script.js

fs.js:66

throw err;

^

Error: EISDIR, read

at rethrow (fs.js:61:21)

at maybeCallback (fs.js:79:42)

at Object.fs.readFile (fs.js:153:18)

at bad (/path/to/script.js:2:17)

at Object. (/path/to/script.js:5:1)

fs.rename(oldPath, newPath, callback)

異步函數(shù) rename(2)∽耘猓回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常妈嘹。

fs.renameSync(oldPath, newPath)

同步函數(shù) rename(2)。 返回undefined绍妨。

fs.ftruncate(fd, len, callback)

異步函數(shù) ftruncate(2)润脸。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常。

fs.ftruncateSync(fd, len)

同步函數(shù) ftruncate(2)痘绎。 返回undefined津函。

fs.truncate(path, len, callback)

異步函數(shù) truncate(2)。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常孤页。 文件描述符也可以作為第一個參數(shù)尔苦,如果這種情況,調(diào)用fs.ftruncate()行施。

fs.truncateSync(path, len)

同步函數(shù) truncate(2)允坚。 返回undefined。

fs.chown(path, uid, gid, callback)

異步函數(shù) chown(2)蛾号。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常稠项。

fs.chownSync(path, uid, gid)

同步函數(shù) chown(2)。 返回undefined鲜结。

fs.fchown(fd, uid, gid, callback)

異步函數(shù) fchown(2)展运。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常。

fs.fchownSync(fd, uid, gid)

同步函數(shù) fchown(2)精刷。 返回undefined拗胜。

fs.lchown(path, uid, gid, callback)

異步函數(shù) lchown(2)。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常怒允。

fs.lchownSync(path, uid, gid)

同步函數(shù) lchown(2)埂软。 返回undefined。

fs.chmod(path, mode, callback)

異步函數(shù) chmod(2)纫事】迸希回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常所灸。

fs.chmodSync(path, mode)

同步函數(shù) chmod(2)。 返回undefined炫七。

fs.fchmod(fd, mode, callback)

異步函數(shù) fchmod(2)爬立。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常。

fs.fchmodSync(fd, mode)

同步函數(shù) fchmod(2)诉字。 返回undefined懦尝。

fs.lchmod(path, mode, callback)

異步函數(shù) lchmod(2)。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常壤圃。

僅在 Mac OS X 可用陵霉。

fs.lchmodSync(path, mode)

同步函數(shù) lchmod(2)。 返回undefined伍绳。

fs.stat(path, callback)

異步函數(shù) stat(2)踊挠。 回調(diào)函數(shù)有兩個參數(shù): (err, stats) ,其中stats是一個fs.Stats對象冲杀。 詳情請參考 fs.Stats效床。

fs.lstat(path, callback)

異步函數(shù) lstat(2)。 回調(diào)函數(shù)有兩個參數(shù): (err, stats) 权谁,其中stats是一個fs.Stats對象剩檀。lstat()與stat()基本相同, 區(qū)別在于,如果path是鏈接旺芽,讀取的是鏈接本身沪猴,而不是它所鏈接到的文件。

fs.fstat(fd, callback)

異步函數(shù) fstat(2)采章。 回調(diào)函數(shù)有兩個參數(shù): (err, stats) 运嗜,其中stats是一個fs.Stats對象。

fs.statSync(path)

同步函數(shù) stat(2)悯舟。 返回fs.Stats實例担租。

fs.lstatSync(path)

同步函數(shù) lstat(2)。 返回fs.Stats實例抵怎。

fs.fstatSync(fd)

同步函數(shù) fstat(2)奋救。 返回fs.Stats實例。

fs.link(srcpath, dstpath, callback)

異步函數(shù) link(2)反惕。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常菠镇。

fs.linkSync(srcpath, dstpath)

同步函數(shù) link(2)。 返回undefined承璃。

fs.symlink(srcpath, dstpath[, type], callback)

異步函數(shù) symlink(2)。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常蚌本。

type可能是'dir','file', 或'junction'(默認'file') 盔粹,僅在 Windows(不考慮其他系統(tǒng))有效隘梨。注意, Windows junction 要求目的地址需要絕對的舷嗡。當使用'junction'的時候轴猎,destination參數(shù)將會自動轉(zhuǎn)換為絕對路徑。

fs.symlinkSync(srcpath, dstpath[, type])

同步函數(shù) symlink(2)进萄。 返回undefined捻脖。

fs.readlink(path, callback)

異步函數(shù) readlink(2)。 回調(diào)函數(shù)有2個參數(shù)(err, linkString).

fs.readlinkSync(path)

同步函數(shù) readlink(2)中鼠。 返回符號鏈接的字符串值可婶。

fs.realpath(path[, cache], callback)

異步函數(shù) realpath(2)。 回調(diào)函數(shù)有2個參數(shù)(err,resolvedPath)援雇∶剩可以使用process.cwd來解決相對路徑問題。

例如:

var cache = {'/etc':'/private/etc'};

fs.realpath('/etc/passwd', cache, function (err, resolvedPath) {

if (err) throw err;

console.log(resolvedPath);

});

fs.realpathSync(path[, cache])

同步函數(shù) realpath(2)惫搏。 返回解析出的路徑具温。

fs.unlink(path, callback)

異步函數(shù) unlink(2)。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常.

fs.unlinkSync(path)

同步函數(shù) unlink(2)筐赔。 返回undefined铣猩。

fs.rmdir(path, callback)

異步函數(shù) rmdir(2)。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常.

fs.rmdirSync(path)

同步函數(shù) rmdir(2)茴丰。 返回undefined达皿。

fs.mkdir(path[, mode], callback)

異步函數(shù) mkdir(2)。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常.mode默認s to0777.

fs.mkdirSync(path[, mode])

同步函數(shù) mkdir(2)较沪。 返回undefined鳞绕。

fs.readdir(path, callback)

異步函數(shù) readdir(3)。 讀取文件夾的內(nèi)容尸曼∶呛危回調(diào)有2個參數(shù)(err, files)files 是文件夾里除了名字為,'.'和'..'`之外的所有文件名控轿。

fs.readdirSync(path)

同步函數(shù) readdir(3)冤竹。 返回除了文件名為'.'和'..'之外的所有文件.

fs.close(fd, callback)

異步函數(shù) close(2)。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常.

fs.closeSync(fd)

同步函數(shù) close(2)茬射。 返回undefined鹦蠕。

fs.open(path, flags[, mode], callback)

異步函數(shù) file open. 參見 open(2)。flags是:

'r'- 以只讀模式打開.如果文件不存在在抛,拋出異常钟病。

'r+'-以讀寫模式打開.如果文件不存在,拋出異常。

'rs'- 同步的肠阱,以只讀模式打開. 指令繞過操作系統(tǒng)直接使用本地文件系統(tǒng)緩存票唆。 這個功能主要用來打開 NFS 掛載的文件,因為它能讓你跳過可能過時的本地緩存屹徘。如果對 I/O 性能很在乎走趋,就不要使用這個標志位。

這里不是調(diào)用fs.open()變成同步阻塞請求噪伊,如果你想要這樣簿煌,可以調(diào)用fs.openSync()。

'rs+'- 同步模式下以讀寫方式打開文件鉴吹。注意事項參見'rs'.

'w'- 以只寫模式打開姨伟。文件會被創(chuàng)建 (如果文件不存在) 或者覆蓋 (如果存在)。

'wx'- 和'w'類似拙寡,如果文件存儲操作失敗

'w+'- 以可讀寫方式打開授滓。文件會被創(chuàng)建 (如果文件不存在) 或者覆蓋 (如果存在)

'wx+'- 和'w+'類似,如果文件存儲操作失敗肆糕。

'a'- 以附加的形式打開般堆。如果文件不存在則創(chuàng)建一個。

'ax'- 和'a'類似诚啃,如果文件存儲操作失敗淮摔。

'a+'- 以只讀和附加的形式打開文件.若文件不存在,則會建立該文件

'ax+'- 和'a+'類似始赎,如果文件存儲操作失敗.

如果文件存在和橙,參數(shù)mode設置文件模式 (permission 和 sticky bits)。 默認是0666, 可讀寫.

回調(diào)有2個參數(shù)(err, fd).

排除標記'x'(對應 open(2)的O_EXCL標記) 保證path是新創(chuàng)建的造垛。在 POSIX 系統(tǒng)里魔招,即使文件不存在,也會被認定為文件存在五辽。 排除標記不能確定在網(wǎng)絡文件系統(tǒng)中是否有效办斑。

Linux系統(tǒng)里,無法對以追加模式打開的文件進行指定位置寫杆逗。系統(tǒng)核心忽略了位置參數(shù)乡翅,每次把數(shù)據(jù)寫到文件的最后。

fs.openSync(path, flags[, mode])

fs.open()的同步版本. 返回整數(shù)形式的文件描述符罪郊。.

fs.utimes(path, atime, mtime, callback)

改變指定路徑文件的時間戳蠕蚜。

fs.utimesSync(path, atime, mtime)

fs.utimes()的同步版本. 返回undefined。

fs.futimes(fd, atime, mtime, callback)

改變傳入的文件描述符指向文件的時間戳悔橄。

fs.futimesSync(fd, atime, mtime)

fs.futimes()的同步版本. 返回undefined靶累。

fs.fsync(fd, callback)

異步函數(shù) fsync(2)腺毫。 回調(diào)函數(shù)只有一個參數(shù):可能出現(xiàn)的異常.

fs.fsyncSync(fd)

同步 fsync(2)。 返回undefined挣柬。

fs.write(fd, buffer, offset, length[, position], callback)

將buffer寫到fd指定的文件里拴曲。

參數(shù)offset和length確定寫哪個部分的緩存。

參數(shù)position是要寫入的文件位置凛忿。如果typeof position !== 'number',將會在當前位置寫入竞川。參見 pwrite(2)店溢。

回調(diào)函數(shù)有三個參數(shù)(err, written, buffer),written指定buffer的多少字節(jié)用來寫委乌。

注意床牧,如果fs.write的回調(diào)還沒執(zhí)行,就多次調(diào)用fs.write遭贸,這樣很不安全戈咳。因此,推薦使用fs.createWriteStream壕吹。

Linux系統(tǒng)里著蛙,無法對以追加模式打開的文件進行指定位置寫。系統(tǒng)核心忽略了位置參數(shù)耳贬,每次把數(shù)據(jù)寫到文件的最后踏堡。

fs.write(fd, data[, position[, encoding]], callback)

將buffer寫到fd指定的文件里。如果data不是 buffer,那么它就會被強制轉(zhuǎn)換為字符串咒劲。

參數(shù)position是要寫入的文件位置顷蟆。如果typeof position !== 'number',將會在當前位置寫入腐魂。參見 pwrite(2)帐偎。

參數(shù)encoding:字符串的編碼方式.

回調(diào)函數(shù)有三個參數(shù)(err, written, buffer),written指定buffer的多少字節(jié)用來寫蛔屹。注意寫入的字節(jié)(bytes)和字符(string characters)不同削樊。參見Buffer.byteLength

和寫入buffer不同判导,必須寫入整個字符串嫉父,不能截取字符串。這是因為返回的字節(jié)的位移跟字符串的位移是不一樣的眼刃。

注意绕辖,如果fs.write的回調(diào)還沒執(zhí)行,就多次調(diào)用fs.write擂红,這樣很不安全仪际。因此围小,推薦使用fs.createWriteStream

Linux系統(tǒng)里,無法對以追加模式打開的文件進行指定位置寫树碱。系統(tǒng)核心忽略了位置參數(shù)肯适,每次把數(shù)據(jù)寫到文件的最后。

fs.writeSync(fd, buffer, offset, length[, position])

fs.writeSync(fd, data[, position[, encoding]])

fs.write()的同步版本. 返回要寫的bytes數(shù).

fs.read(fd, buffer, offset, length, position, callback)

讀取fd指定文件的數(shù)據(jù)成榜。

buffer是緩沖區(qū)框舔,數(shù)據(jù)將會寫入到這里.

offset寫入的偏移量

length需要讀的文件長度

position讀取的文件起始位置,如果是position是null赎婚, 將會從當前位置讀刘绣。

回調(diào)函數(shù)有3個參數(shù),(err, bytesRead, buffer).

fs.readSync(fd, buffer, offset, length, position)

fs.read的同步版本. 返回bytesRead的數(shù)量.

fs.readFile(filename[, options], callback)

filename{String}

options{Object}

encoding{String | Null} 默認 =null

flag{String} 默認 ='r'

callback{Function}

異步讀取整個文件的內(nèi)容。例如:

fs.readFile('/etc/passwd', function (err, data) {

if (err) throw err;

console.log(data);

});

回調(diào)函數(shù)有2個參數(shù)(err, data), 參數(shù)data是文件的內(nèi)容挣输。 如果沒有指定參數(shù)encoding, 返回原生 buffer

fs.readFileSync(filename[, options])

fs.readFile的同步版本. 返回整個文件的內(nèi)容.

如果沒有指定參數(shù)encoding, 返回buffer纬凤。

fs.writeFile(filename, data[, options], callback)

filename{String}

data{String | Buffer}

options{Object}

encoding{String | Null} 默認 ='utf8'

mode{Number} 默認 =438(aka0666in Octal)

flag{String} 默認 ='w'

callback{Function}

異步寫文件,如果文件已經(jīng)存在則替換撩嚼。data可以是緩存或者字符串停士。

如果參數(shù)data是 buffer,會忽略參數(shù)encoding完丽。默認值是'utf8'恋技。

列如:

fs.writeFile('message.txt', 'Hello Node', function (err) {

if (err) throw err;

console.log('It\'s saved!');

});

fs.writeFileSync(filename, data[, options])

fs.writeFile的同步版本. 返回undefined。

fs.appendFile(filename, data[, options], callback)

filename{String}

data{String | Buffer}

options{Object}

encoding{String | Null} 默認 ='utf8'

mode{Number} 默認 =438(aka0666in Octal)

flag{String} 默認 ='a'

callback{Function}

異步的給文件添加數(shù)據(jù)舰涌,如果文件不存在猖任,就創(chuàng)建一個。data可以是緩存或者字符串瓷耙。

例如:

fs.appendFile('message.txt', 'data to append', function (err) {

if (err) throw err;

console.log('The "data to append" was appended to file!');

});

fs.appendFileSync(filename, data[, options])

fs.appendFile的同步版本. 返回undefined朱躺。

fs.watchFile(filename[, options], listener)

穩(wěn)定性: 2 - 不穩(wěn)定。? 盡可能的用 fs.watch 來替換搁痛。

監(jiān)視filename文件的變化长搀。每當文件被訪問的時候都會調(diào)用listener。

第二個參數(shù)可選鸡典。如果有源请,它必須包含兩個 boolean 參數(shù)(persistent和interval)的對象。persistent指定文件被監(jiān)視時進程是否繼續(xù)運行彻况。interval指定了查詢文件的間隔谁尸,以毫秒為單位。缺省值為{ persistent: true, interval: 5007 }纽甘。

listener 有兩個參數(shù)良蛮,第一個為文件現(xiàn)在的狀態(tài),第二個為文件的前一個狀態(tài):

fs.watchFile('message.text', function (curr, prev) {

console.log('the current mtime is: ' + curr.mtime);

console.log('the previous mtime was: ' + prev.mtime);

});

listener中的文件狀態(tài)對象類型為 fs.Stat悍赢。

如果想修改文件時被通知决瞳,而不是訪問的時候就通知货徙,可以比較curr.mtime和prev.mtime。

fs.unwatchFile(filename[, listener])

穩(wěn)定性: 2 - 不穩(wěn)定. 盡可能的用 fs.watch 來替換皮胡。

停止監(jiān)視filename文件的變化痴颊。如果指定了listener,那只會移除這個listener屡贺。否則蠢棱,移除所有的 listener,并會停止監(jiān)視filename甩栈。

調(diào)用fs.unwatchFile()停止監(jiān)視一個沒被監(jiān)視的文件裳扯,不會觸發(fā)錯誤,而會發(fā)生一個no-op谤职。

fs.watch(filename[, options][, listener])

穩(wěn)定性: 2 - 不穩(wěn)定.

觀察filename指定的文件或文件夾的改變。返回對象是fs.FSWatcher亿鲜。

第二個參數(shù)可選允蜈。如果有,它必須是包含兩個 boolean 參數(shù)(persistent和recursive)的對象蒿柳。persistent指定文件被監(jiān)視時進程是否繼續(xù)運行饶套。recursive表明是監(jiān)視所有的子文件夾還是當前文件夾,這個參數(shù)只有監(jiān)視對象是文件夾時才有效垒探,而且僅在支持的系統(tǒng)里有效(參見下面注意事項)妓蛮。

默認值{ persistent: true, recursive: false }.

回調(diào)函數(shù)有2個參數(shù)(event, filename)。event是rename或change圾叼。filename是觸發(fā)事件的文件名蛤克。

注意事項

fs.watchAPI 不是 100% 的跨平臺兼容,可能在某些情況下不可用夷蚊。

recursive參數(shù)僅在 OS X 上可用构挤。僅FSEvents支持這個類型文件的監(jiān)視,所以未來也不太可能有新的平臺加入惕鼓。

可用性

這些特性依賴于底層系統(tǒng)提供文件系統(tǒng)變動的通知筋现。

Linux 系統(tǒng),使用inotify.

BSD 系統(tǒng),使用kqueue.

OS X,文件使用kqueue,文件夾使用FSEvents.

SunOS 系統(tǒng)(包括 Solaris 和 SmartOS),使用event ports.

Windows 系統(tǒng), 依賴與ReadDirectoryChangesW.

如果底層系統(tǒng)函數(shù)不可用箱歧,那么fs.watch就無法工作矾飞。例如,監(jiān)視網(wǎng)絡文件系統(tǒng)(NFS, SMB, 等)經(jīng)常不能用呀邢。你仍然可以用fs.watchFile查詢洒沦,但是會比較慢,且不可靠驼鹅。

文件名參數(shù)

回調(diào)函數(shù)中提供文件名參數(shù)微谓,不是每個平臺都能用(Linux 和 Windows 就不行)森篷。即使在可用的平臺,也不能保證都能提供豺型。所以不要假設回調(diào)函數(shù)中filename參數(shù)有效仲智,要在代碼里添加一些為空的邏輯判斷。

fs.watch('somedir', function (event, filename) {

console.log('event is: ' + event);

if (filename) {

console.log('filename provided: ' + filename);

} else {

console.log('filename not provided');

}

});

fs.exists(path, callback)

判斷文件是否存在姻氨,回調(diào)函數(shù)參數(shù)是 bool 值钓辆。例如:

fs.exists('/etc/passwd', function (exists) {

util.debug(exists ? "it's there" : "no passwd!");

});

fs.exists()是老版本的函數(shù),因此在代碼里不要用肴焊。

另外前联,打開文件前判斷是否存在有漏洞,在fs.exists()和fs.open()調(diào)用中間娶眷,另外一個進程有可能已經(jīng)移除了文件似嗤。最好用fs.open()來打開文件,根據(jù)回調(diào)函數(shù)來判斷是否有錯誤届宠。

fs.exists()未來會被移除烁落。

fs.existsSync(path)

fs.exists()的同步版本. 如果文件存在返回true, 否則返回false。

fs.existsSync()未來會被移除豌注。

fs.access(path[, mode], callback)

測試由參數(shù)path指向的文件的用戶權限伤塌。可選參數(shù)mode為整數(shù)轧铁,它表示需要檢查的權限每聪。下面列出了所有值。mode可以是單個值齿风,或者可以通過或運算药薯,掩碼運算實現(xiàn)多個權限檢查。

fs.F_OK- 文件是對于進程可見救斑,可以用來檢查文件是否存在果善。參數(shù)mode的默認值竖席。

fs.R_OK- 文件對于進程是否可讀浴骂。

fs.W_OK- 文件對于進程是否可寫。

fs.X_OK- 文件對于進程是否可執(zhí)行菠剩。(Windows系統(tǒng)不可用纪他,執(zhí)行效果等同fs.F_OK)

第三個參數(shù)是回調(diào)函數(shù)鄙煤。如果檢查失敗,回調(diào)函數(shù)的參數(shù)就是響應的錯誤茶袒。下面的例子檢查文件/etc/passwd是否能被當前的進程讀寫梯刚。

fs.access('/etc/passwd', fs.R_OK | fs.W_OK, function(err) {

util.debug(err ? 'no access!' : 'can read/write');

});

fs.accessSync(path[, mode])

fs.access的同步版本. 如果發(fā)生錯誤拋出異常,否則不做任何事情薪寓。

類: fs.Stats

fs.stat(),fs.lstat()和fs.fstat()以及同步版本的返回對象亡资。

stats.isFile()

stats.isDirectory()

stats.isBlockDevice()

stats.isCharacterDevice()

stats.isSymbolicLink()(only valid withfs.lstat())

stats.isFIFO()

stats.isSocket()

對普通文件使用util.inspect(stats)澜共,返回的字符串和下面類似:

{ dev: 2114,

ino: 48064969,

mode: 33188,

nlink: 1,

uid: 85,

gid: 100,

rdev: 0,

size: 527,

blksize: 4096,

blocks: 8,

atime: Mon, 10 Oct 2011 23:24:11 GMT,

mtime: Mon, 10 Oct 2011 23:24:11 GMT,

ctime: Mon, 10 Oct 2011 23:24:11 GMT,

birthtime: Mon, 10 Oct 2011 23:24:11 GMT }

atime,mtime,birthtime, 和ctime都是Date的實例,需要使用合適的方法來比較這些值锥腻。通常使用getTime()來獲取時間戳(毫秒嗦董,從1 January 1970 00:00:00 UTC開始算),這個整數(shù)基本能滿足任何比較條件瘦黑。也有一些其他方法來顯示額外信息京革。更多參見MDN JavaScript Reference

Stat Time Values

狀態(tài)對象(stat object)有以下語義:

atime訪問時間 - 文件的最后訪問時間.mknod(2),utimes(2), 和read(2)等系統(tǒng)調(diào)用可以改變.

mtime修改時間 - 文件的最后修改時間.mknod(2),utimes(2), 和write(2)等系統(tǒng)調(diào)用可以改變.

ctime改變時間 - 文件狀態(tài)(inode)的最后修改時間.chmod(2),chown(2),link(2),mknod(2),rename(2),unlink(2),utimes(2),read(2), 和write(2)等系統(tǒng)調(diào)用可以改變.

birthtime"Birth Time" - 文件創(chuàng)建時間,文件創(chuàng)建時生成幸斥。 在一些不提供文件 birthtime 的文件系統(tǒng)中, 這個字段會使用 ctime 或 1970-01-01T00:00Z (ie, unix epoch timestamp 0)來填充匹摇。 在 Darwin 和其他 FreeBSD 系統(tǒng)變體中, 也將 atime 顯式地設置成比它現(xiàn)在的 birthtime 更早的一個時間值,這個過程使用了 utimes(2) 系統(tǒng)調(diào)用甲葬。

在 Node v0.12 版本之前, Windows 系統(tǒng)里 ctime 有 birthtime 值. 注意在v.0.12版本中, ctime 不再是"creation time", 而且在Unix系統(tǒng)中廊勃,他一直都不是。

fs.createReadStream(path[, options])

返回可讀流對象 (見Readable Stream)经窖。

options默認值如下:

{ flags: 'r',

encoding: null,

fd: null,

mode: 0666,

autoClose: true

}

參數(shù)options提供start和end位置來讀取文件的特定范圍內(nèi)容供搀,而不是整個文件。start和end都在文件范圍里钠至,并從 0 開始,encoding是'utf8','ascii', 或'base64'胎源。

如果給了fd值棉钧,ReadStream將會忽略path參數(shù),而使用文件描述涕蚤,這樣不會觸發(fā)任何open事件宪卿。

如果autoClose為 false,即使發(fā)生錯誤文件也不會關閉万栅,需要你來負責關閉佑钾,避免文件描述符泄露。如果autoClose是 true(默認值)烦粒,遇到error或end休溶,文件描述符將會自動關閉。

例如扰她,從100個字節(jié)的文件里兽掰,讀取最少10個字節(jié):

fs.createReadStream('sample.txt', {start: 90, end: 99});

Class: fs.ReadStream

ReadStream是Readable Stream

Event: 'open'

fd{Integer} ReadStream 所使用的文件描述符徒役。

當創(chuàng)建文件的ReadStream時觸發(fā)孽尽。

fs.createWriteStream(path[, options])

返回一個新的寫對象 (參見Writable Stream)。

options是一個對象忧勿,默認值:

{ flags: 'w',

encoding: null,

fd: null,

mode: 0666 }

options 也可以包含一個 start 選項杉女,在指定文件中寫入數(shù)據(jù)開始位置瞻讽。 修改而不替換文件需要 flags 的模式指定為 r+ 而不是默值的 w.

和之前的ReadStream類似,如果fd不為空熏挎,WriteStream將會忽略path參數(shù)速勇,轉(zhuǎn)而使用文件描述,這樣不會觸發(fā)任何open事件婆瓜。

類: fs.WriteStream

WriteStream是Writable Stream快集。

Event: 'open'

fd{Integer} WriteStream 所用的文件描述符

打開 WriteStream file 時觸發(fā)。

file.bytesWritten

目前寫入的字節(jié)數(shù)廉白,不含等待寫入的數(shù)據(jù)个初。

Class: fs.FSWatcher

fs.watch()返回的對象就是這個類.

watcher.close()

停止觀察fs.FSWatcher對象中的更改。

Event: 'change'

event{String} fs 改變的類型

filename{String} 改變的文件名 (if relevant/available)

當監(jiān)聽的文件或文件夾改變的時候觸發(fā)猴蹂,參見fs.watch院溺。

Event: 'error'

error{Error object}

錯誤發(fā)生時觸發(fā)。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磅轻,一起剝皮案震驚了整個濱河市珍逸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聋溜,老刑警劉巖谆膳,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撮躁,居然都是意外死亡漱病,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門把曼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杨帽,“玉大人,你說我怎么就攤上這事嗤军∽⒂” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵叙赚,是天一觀的道長老客。 經(jīng)常有香客問我,道長震叮,這世上最難降的妖魔是什么沿量? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮冤荆,結果婚禮上朴则,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好乌妒,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布汹想。 她就那樣靜靜地躺著,像睡著了一般撤蚊。 火紅的嫁衣襯著肌膚如雪古掏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天侦啸,我揣著相機與錄音槽唾,去河邊找鬼。 笑死光涂,一個胖子當著我的面吹牛庞萍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忘闻,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼钝计,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了齐佳?” 一聲冷哼從身側(cè)響起私恬,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炼吴,沒想到半個月后本鸣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡硅蹦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年荣德,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片提针。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖曹傀,靈堂內(nèi)的尸體忽然破棺而出辐脖,到底是詐尸還是另有隱情,我是刑警寧澤皆愉,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布嗜价,位于F島的核電站,受9級特大地震影響幕庐,放射性物質(zhì)發(fā)生泄漏久锥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一异剥、第九天 我趴在偏房一處隱蔽的房頂上張望瑟由。 院中可真熱鬧,春花似錦冤寿、人聲如沸歹苦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殴瘦。三九已至狠角,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚪腋,已是汗流浹背丰歌。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屉凯,地道東北人立帖。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像神得,于是被迫代替她去往敵國和親厘惦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容