?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
穩(wěn)定性: 3 - 穩(wěn)定
文件系統(tǒng)模塊是一個(gè)封裝了標(biāo)準(zhǔn)的 POSIX 文件 I/O 操作的集合。通過(guò) require('fs')
使用這個(gè)模塊。所有的方法都有同步和異步兩種模式。
異步方法最后一個(gè)參數(shù)都是回調(diào)函數(shù),這個(gè)回調(diào)的參數(shù)取決于方法,不過(guò)第一個(gè)參數(shù)一般都是異常。如果操作成功,那么第一個(gè)參數(shù)就是 null
或 undefined
。
當(dāng)使用一個(gè)同步操作的時(shí)候,任意的異常都立即拋出,可以用 try/catch 來(lái)處理異常,使得程序正常運(yùn)行。
這是異步操作的例子:
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');
異步方法不能保證操作順序,因此下面的例子很容易出錯(cuò):
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)); }); });
在繁忙的進(jìn)程里,強(qiáng)烈建議使用異步方法。同步方法會(huì)阻塞整個(gè)進(jìn)程,直到方法完成。
可能會(huì)用到相對(duì)路徑,路徑是相對(duì) process.cwd()
來(lái)說(shuō)的。
大部分 fs 函數(shù)會(huì)忽略回調(diào)參數(shù),如果忽略,將會(huì)用默認(rèn)函數(shù)拋出異常。如果想得到原調(diào)用點(diǎn)的堆棧信息,需要設(shè)置環(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.<anonymous> (/path/to/script.js:5:1) <etc.>
異步函數(shù) rename(2)?;卣{(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。
同步函數(shù) rename(2)。 返回 undefined
。
異步函數(shù) ftruncate(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。
同步函數(shù) ftruncate(2)。 返回 undefined
。
異步函數(shù) truncate(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。 文件描述符也可以作為第一個(gè)參數(shù),如果這種情況,調(diào)用 fs.ftruncate()
。
同步函數(shù) truncate(2)。 返回 undefined
。
異步函數(shù) chown(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。
同步函數(shù) chown(2)。 返回 undefined
。
異步函數(shù) fchown(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。
同步函數(shù) fchown(2)。 返回 undefined
。
異步函數(shù) lchown(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。
同步函數(shù) lchown(2)。 返回 undefined
。
異步函數(shù) chmod(2)。回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。
同步函數(shù) chmod(2)。 返回 undefined
。
異步函數(shù) fchmod(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。
同步函數(shù) fchmod(2)。 返回 undefined
。
異步函數(shù) lchmod(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。
僅在 Mac OS X 可用。
同步函數(shù) lchmod(2)。 返回 undefined
。
異步函數(shù) stat(2)。 回調(diào)函數(shù)有兩個(gè)參數(shù): (err, stats) ,其中 stats
是一個(gè) fs.Stats
對(duì)象。 詳情請(qǐng)參考 fs.Stats。
異步函數(shù) lstat(2)。 回調(diào)函數(shù)有兩個(gè)參數(shù): (err, stats) ,其中 stats
是一個(gè) fs.Stats
對(duì)象。 lstat()
與 stat()
基本相同, 區(qū)別在于,如果 path
是鏈接,讀取的是鏈接本身,而不是它所鏈接到的文件。
異步函數(shù) fstat(2)。 回調(diào)函數(shù)有兩個(gè)參數(shù): (err, stats) ,其中 stats
是一個(gè) fs.Stats
對(duì)象。
同步函數(shù) stat(2)。 返回 fs.Stats
實(shí)例。
同步函數(shù) lstat(2)。 返回 fs.Stats
實(shí)例。
同步函數(shù) fstat(2)。 返回 fs.Stats
實(shí)例。
異步函數(shù) link(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。
同步函數(shù) link(2)。 返回 undefined
。
異步函數(shù) symlink(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常。
type
可能是 'dir'
, 'file'
, 或 'junction'
(默認(rèn) 'file'
) ,僅在 Windows(不考慮其他系統(tǒng))有效。注意, Windows junction 要求目的地址需要絕對(duì)的。當(dāng)使用 'junction'
的時(shí)候,destination
參數(shù)將會(huì)自動(dòng)轉(zhuǎn)換為絕對(duì)路徑。
同步函數(shù) symlink(2)。 返回 undefined
。
異步函數(shù) readlink(2)。 回調(diào)函數(shù)有2個(gè)參數(shù) (err, linkString)
.
同步函數(shù) readlink(2)。 返回符號(hào)鏈接的字符串值。
異步函數(shù) realpath(2)。 回調(diào)函數(shù)有2個(gè)參數(shù) (err,resolvedPath)
??梢允褂?process.cwd
來(lái)解決相對(duì)路徑問(wèn)題。
例如:
var cache = {'/etc':'/private/etc'}; fs.realpath('/etc/passwd', cache, function (err, resolvedPath) { if (err) throw err; console.log(resolvedPath); });
同步函數(shù) realpath(2)。 返回解析出的路徑。
異步函數(shù) unlink(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常.
同步函數(shù) unlink(2)。 返回 undefined
。
異步函數(shù) rmdir(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常.
同步函數(shù) rmdir(2)。 返回 undefined
。
異步函數(shù) mkdir(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常. mode
默認(rèn)s to 0777
.
同步函數(shù) mkdir(2)。 返回 undefined
。
異步函數(shù) readdir(3)。 讀取文件夾的內(nèi)容?;卣{(diào)有2個(gè)參數(shù) (err, files)
files 是文件夾里除了名字為,
'.'和
'..'`之外的所有文件名。
同步函數(shù) readdir(3)。 返回除了文件名為 '.'
和 '..'
之外的所有文件.
異步函數(shù) close(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常.
同步函數(shù) close(2)。 返回 undefined
。
異步函數(shù) file open. 參見(jiàn) open(2)。 flags
是:
'r'
- 以只讀模式打開(kāi).如果文件不存在,拋出異常。
'r+'
-以讀寫(xiě)模式打開(kāi).如果文件不存在,拋出異常。
'rs'
- 同步的,以只讀模式打開(kāi). 指令繞過(guò)操作系統(tǒng)直接使用本地文件系統(tǒng)緩存。
這個(gè)功能主要用來(lái)打開(kāi) NFS 掛載的文件,因?yàn)樗茏屇闾^(guò)可能過(guò)時(shí)的本地緩存。如果對(duì) I/O 性能很在乎,就不要使用這個(gè)標(biāo)志位。
這里不是調(diào)用 fs.open()
變成同步阻塞請(qǐng)求,如果你想要這樣,可以調(diào)用 fs.openSync()
。
'rs+'
- 同步模式下以讀寫(xiě)方式打開(kāi)文件。注意事項(xiàng)參見(jiàn) 'rs'
.
'w'
- 以只寫(xiě)模式打開(kāi)。文件會(huì)被創(chuàng)建 (如果文件不存在) 或者覆蓋 (如果存在)。
'wx'
- 和 'w'
類(lèi)似,如果文件存儲(chǔ)操作失敗
'w+'
- 以可讀寫(xiě)方式打開(kāi)。文件會(huì)被創(chuàng)建 (如果文件不存在) 或者覆蓋 (如果存在)
'wx+'
- 和 'w+'
類(lèi)似,如果文件存儲(chǔ)操作失敗。
'a'
- 以附加的形式打開(kāi)。如果文件不存在則創(chuàng)建一個(gè)。
'ax'
- 和 'a'
類(lèi)似,如果文件存儲(chǔ)操作失敗。
'a+'
- 以只讀和附加的形式打開(kāi)文件.若文件不存在,則會(huì)建立該文件
'ax+'
- 和 'a+'
類(lèi)似,如果文件存儲(chǔ)操作失敗.
如果文件存在,參數(shù)mode
設(shè)置文件模式 (permission 和 sticky bits)。 默認(rèn)是 0666
, 可讀寫(xiě).
回調(diào)有2個(gè)參數(shù) (err, fd)
.
排除標(biāo)記 'x'
(對(duì)應(yīng) open(2)的O_EXCL
標(biāo)記) 保證 path
是新創(chuàng)建的。在 POSIX 系統(tǒng)里,即使文件不存在,也會(huì)被認(rèn)定為文件存在。 排除標(biāo)記不能確定在網(wǎng)絡(luò)文件系統(tǒng)中是否有效。
Linux系統(tǒng)里,無(wú)法對(duì)以追加模式打開(kāi)的文件進(jìn)行指定位置寫(xiě)。系統(tǒng)核心忽略了位置參數(shù),每次把數(shù)據(jù)寫(xiě)到文件的最后。
fs.open()
的同步版本. 返回整數(shù)形式的文件描述符。.
改變指定路徑文件的時(shí)間戳。
fs.utimes()
的同步版本. 返回 undefined
。
改變傳入的文件描述符指向文件的時(shí)間戳。
fs.futimes()
的同步版本. 返回 undefined
。
異步函數(shù) fsync(2)。 回調(diào)函數(shù)只有一個(gè)參數(shù):可能出現(xiàn)的異常.
同步 fsync(2)。 返回 undefined
。
將 buffer
寫(xiě)到 fd
指定的文件里。
參數(shù) offset
和 length
確定寫(xiě)哪個(gè)部分的緩存。
參數(shù) position
是要寫(xiě)入的文件位置。如果 typeof position !== 'number'
,將會(huì)在當(dāng)前位置寫(xiě)入。參見(jiàn) pwrite(2)。
回調(diào)函數(shù)有三個(gè)參數(shù) (err, written, buffer)
,written
指定 buffer
的多少字節(jié)用來(lái)寫(xiě)。
注意,如果 fs.write
的回調(diào)還沒(méi)執(zhí)行,就多次調(diào)用 fs.write
,這樣很不安全。因此,推薦使用 fs.createWriteStream
。
Linux系統(tǒng)里,無(wú)法對(duì)以追加模式打開(kāi)的文件進(jìn)行指定位置寫(xiě)。系統(tǒng)核心忽略了位置參數(shù),每次把數(shù)據(jù)寫(xiě)到文件的最后。
將 buffer
寫(xiě)到 fd
指定的文件里。如果 data
不是 buffer,那么它就會(huì)被強(qiáng)制轉(zhuǎn)換為字符串。
參數(shù) position
是要寫(xiě)入的文件位置。如果 typeof position !== 'number'
,將會(huì)在當(dāng)前位置寫(xiě)入。參見(jiàn) pwrite(2)。
參數(shù) encoding
:字符串的編碼方式.
回調(diào)函數(shù)有三個(gè)參數(shù) (err, written, buffer)
,written
指定 buffer
的多少字節(jié)用來(lái)寫(xiě)。注意寫(xiě)入的字節(jié)(bytes)和字符(string characters)不同。參見(jiàn)Buffer.byteLength。
和寫(xiě)入 buffer
不同,必須寫(xiě)入整個(gè)字符串,不能截取字符串。這是因?yàn)榉祷氐淖止?jié)的位移跟字符串的位移是不一樣的。
注意,如果 fs.write
的回調(diào)還沒(méi)執(zhí)行,就多次調(diào)用 fs.write
,這樣很不安全。因此,推薦使用 fs.createWriteStream
Linux系統(tǒng)里,無(wú)法對(duì)以追加模式打開(kāi)的文件進(jìn)行指定位置寫(xiě)。系統(tǒng)核心忽略了位置參數(shù),每次把數(shù)據(jù)寫(xiě)到文件的最后。
fs.write()
的同步版本. 返回要寫(xiě)的bytes數(shù).
讀取 fd
指定文件的數(shù)據(jù)。
buffer
是緩沖區(qū),數(shù)據(jù)將會(huì)寫(xiě)入到這里.
offset
寫(xiě)入的偏移量
length
需要讀的文件長(zhǎng)度
position
讀取的文件起始位置,如果是 position
是 null
, 將會(huì)從當(dāng)前位置讀。
回調(diào)函數(shù)有3個(gè)參數(shù), (err, bytesRead, buffer)
.
fs.read
的同步版本. 返回 bytesRead
的數(shù)量.
filename
{String}
options
{Object}
encoding
{String | Null} 默認(rèn) = null
flag
{String} 默認(rèn) = 'r'
callback
{Function}
異步讀取整個(gè)文件的內(nèi)容。例如:
fs.readFile('/etc/passwd', function (err, data) { if (err) throw err; console.log(data); });
回調(diào)函數(shù)有2個(gè)參數(shù) (err, data)
, 參數(shù) data
是文件的內(nèi)容。
如果沒(méi)有指定參數(shù) encoding
, 返回原生 buffer
fs.readFile
的同步版本. 返回整個(gè)文件的內(nèi)容.
如果沒(méi)有指定參數(shù) encoding
, 返回buffer。
filename
{String}
data
{String | Buffer}
options
{Object}
encoding
{String | Null} 默認(rèn) = 'utf8'
mode
{Number} 默認(rèn) = 438
(aka 0666
in Octal)
flag
{String} 默認(rèn) = 'w'
callback
{Function}
異步寫(xiě)文件,如果文件已經(jīng)存在則替換。 data
可以是緩存或者字符串。
如果參數(shù) data
是 buffer,會(huì)忽略參數(shù) encoding
。默認(rèn)值是 'utf8'
。
列如:
fs.writeFile('message.txt', 'Hello Node', function (err) { if (err) throw err; console.log('It\'s saved!'); });
fs.writeFile
的同步版本. 返回 undefined
。
filename
{String}
data
{String | Buffer}
options
{Object}
encoding
{String | Null} 默認(rèn) = 'utf8'
mode
{Number} 默認(rèn) = 438
(aka 0666
in Octal)
flag
{String} 默認(rèn) = 'a'
callback
{Function}
異步的給文件添加數(shù)據(jù),如果文件不存在,就創(chuàng)建一個(gè)。 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.appendFile
的同步版本. 返回 undefined
。
穩(wěn)定性: 2 - 不穩(wěn)定。 盡可能的用 fs.watch 來(lái)替換。
監(jiān)視 filename
文件的變化。每當(dāng)文件被訪問(wèn)的時(shí)候都會(huì)調(diào)用listener
。
第二個(gè)參數(shù)可選。如果有,它必須包含兩個(gè) boolean 參數(shù)(persistent
和 interval
)的對(duì)象。 persistent
指定文件被監(jiān)視時(shí)進(jìn)程是否繼續(xù)運(yùn)行。 interval
指定了查詢(xún)文件的間隔,以毫秒為單位。缺省值為{ persistent: true, interval: 5007 }。
listener 有兩個(gè)參數(shù),第一個(gè)為文件現(xiàn)在的狀態(tài),第二個(gè)為文件的前一個(gè)狀態(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)對(duì)象類(lèi)型為 fs.Stat。
如果想修改文件時(shí)被通知,而不是訪問(wèn)的時(shí)候就通知,可以比較 curr.mtime
和 prev.mtime
。
穩(wěn)定性: 2 - 不穩(wěn)定. 盡可能的用 fs.watch 來(lái)替換。
停止監(jiān)視 filename
文件的變化。如果指定了 listener
,那只會(huì)移除這個(gè) listener
。否則,移除所有的 listener,并會(huì)停止監(jiān)視 filename
。
調(diào)用 fs.unwatchFile()
停止監(jiān)視一個(gè)沒(méi)被監(jiān)視的文件,不會(huì)觸發(fā)錯(cuò)誤,而會(huì)發(fā)生一個(gè)no-op。
穩(wěn)定性: 2 - 不穩(wěn)定.
觀察 filename
指定的文件或文件夾的改變。返回對(duì)象是 fs.FSWatcher。
第二個(gè)參數(shù)可選。如果有,它必須是包含兩個(gè) boolean 參數(shù)(persistent
和 recursive
)的對(duì)象。 persistent
指定文件被監(jiān)視時(shí)進(jìn)程是否繼續(xù)運(yùn)行。 recursive
表明是監(jiān)視所有的子文件夾還是當(dāng)前文件夾,這個(gè)參數(shù)只有監(jiān)視對(duì)象是文件夾時(shí)才有效,而且僅在支持的系統(tǒng)里有效(參見(jiàn)下面注意事項(xiàng))。
默認(rèn)值 { persistent: true, recursive: false }
.
回調(diào)函數(shù)有2個(gè)參數(shù) (event, filename)
。event
是 rename
或 change
。filename
是觸發(fā)事件的文件名。
fs.watch
API 不是 100% 的跨平臺(tái)兼容,可能在某些情況下不可用。
recursive
參數(shù)僅在 OS X 上可用。僅 FSEvents
支持這個(gè)類(lèi)型文件的監(jiān)視,所以未來(lái)也不太可能有新的平臺(tái)加入。
這些特性依賴(lài)于底層系統(tǒng)提供文件系統(tǒng)變動(dòng)的通知。
Linux 系統(tǒng),使用 inotify
.
BSD 系統(tǒng),使用 kqueue
.
OS X,文件使用 kqueue
,文件夾使用 FSEvents
.
SunOS 系統(tǒng)(包括 Solaris 和 SmartOS),使用 event ports
.
Windows 系統(tǒng), 依賴(lài)與 ReadDirectoryChangesW
.
如果底層系統(tǒng)函數(shù)不可用,那么fs.watch
就無(wú)法工作。例如,監(jiān)視網(wǎng)絡(luò)文件系統(tǒng)(NFS, SMB, 等)經(jīng)常不能用。你仍然可以用 fs.watchFile
查詢(xún),但是會(huì)比較慢,且不可靠。
回調(diào)函數(shù)中提供文件名參數(shù),不是每個(gè)平臺(tái)都能用(Linux 和 Windows 就不行)。即使在可用的平臺(tái),也不能保證都能提供。所以不要假設(shè)回調(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'); } });
判斷文件是否存在,回調(diào)函數(shù)參數(shù)是 bool 值。例如:
fs.exists('/etc/passwd', function (exists) { util.debug(exists ? "it's there" : "no passwd!"); });
fs.exists()
是老版本的函數(shù),因此在代碼里不要用。
另外,打開(kāi)文件前判斷是否存在有漏洞,在fs.exists()
和 fs.open()
調(diào)用中間,另外一個(gè)進(jìn)程有可能已經(jīng)移除了文件。最好用 fs.open()
來(lái)打開(kāi)文件,根據(jù)回調(diào)函數(shù)來(lái)判斷是否有錯(cuò)誤。
fs.exists()
未來(lái)會(huì)被移除。
fs.exists()
的同步版本. 如果文件存在返回 true
, 否則返回false
。
fs.existsSync()
未來(lái)會(huì)被移除。
測(cè)試由參數(shù) path
指向的文件的用戶(hù)權(quán)限??蛇x參數(shù) mode
為整數(shù),它表示需要檢查的權(quán)限。下面列出了所有值。mode
可以是單個(gè)值,或者可以通過(guò)或運(yùn)算,掩碼運(yùn)算實(shí)現(xiàn)多個(gè)權(quán)限檢查。
fs.F_OK
- 文件是對(duì)于進(jìn)程可見(jiàn),可以用來(lái)檢查文件是否存在。參數(shù) mode
的默認(rèn)值。
fs.R_OK
- 文件對(duì)于進(jìn)程是否可讀。
fs.W_OK
- 文件對(duì)于進(jìn)程是否可寫(xiě)。
fs.X_OK
- 文件對(duì)于進(jìn)程是否可執(zhí)行。(Windows系統(tǒng)不可用,執(zhí)行效果等同fs.F_OK
)
第三個(gè)參數(shù)是回調(diào)函數(shù)。如果檢查失敗,回調(diào)函數(shù)的參數(shù)就是響應(yīng)的錯(cuò)誤。下面的例子檢查文件/etc/passwd
是否能被當(dāng)前的進(jìn)程讀寫(xiě)。
fs.access('/etc/passwd', fs.R_OK | fs.W_OK, function(err) { util.debug(err ? 'no access!' : 'can read/write'); });
fs.access
的同步版本. 如果發(fā)生錯(cuò)誤拋出異常,否則不做任何事情。
fs.stat()
, fs.lstat()
和 fs.fstat()
以及同步版本的返回對(duì)象。
stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink()
(only valid with fs.lstat()
)
stats.isFIFO()
stats.isSocket()
對(duì)普通文件使用 util.inspect(stats)
,返回的字符串和下面類(lèi)似:
{ 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
都是 getTime() 來(lái)獲取時(shí)間戳(毫秒,從 1 January 1970 00:00:00 UTC 開(kāi)始算),這個(gè)整數(shù)基本能滿足任何比較條件。也有一些其他方法來(lái)顯示額外信息。更多參見(jiàn)<a rel="nofollow" href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date"">MDN JavaScript Reference
狀態(tài)對(duì)象(stat object)有以下語(yǔ)義:
atime
訪問(wèn)時(shí)間 - 文件的最后訪問(wèn)時(shí)間. mknod(2)
, utimes(2)
, 和 read(2)
等系統(tǒng)調(diào)用可以改變.
mtime
修改時(shí)間 - 文件的最后修改時(shí)間. mknod(2)
, utimes(2)
, 和 write(2)
等系統(tǒng)調(diào)用可以改變.
ctime
改變時(shí)間 - 文件狀態(tài)(inode)的最后修改時(shí)間. 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)建時(shí)間,文件創(chuàng)建時(shí)生成。 在一些不提供文件 birthtime 的文件系統(tǒng)中, 這個(gè)字段會(huì)使用 ctime 或 1970-01-01T00:00Z (ie, unix epoch timestamp 0)來(lái)填充。 在 Darwin 和其他 FreeBSD 系統(tǒng)變體中, 也將 atime 顯式地設(shè)置成比它現(xiàn)在的 birthtime 更早的一個(gè)時(shí)間值,這個(gè)過(guò)程使用了 utimes(2) 系統(tǒng)調(diào)用。
在 Node v0.12 版本之前, Windows 系統(tǒng)里 ctime 有 birthtime 值. 注意在v.0.12版本中, ctime 不再是"creation time", 而且在Unix系統(tǒng)中,他一直都不是。
返回可讀流對(duì)象 (見(jiàn) Readable Stream
)。
options
默認(rèn)值如下:
{ flags: 'r', encoding: null, fd: null, mode: 0666, autoClose: true }
參數(shù) options
提供 start
和 end
位置來(lái)讀取文件的特定范圍內(nèi)容,而不是整個(gè)文件。start
和 end
都在文件范圍里,并從 0 開(kāi)始, encoding
是 'utf8'
, 'ascii'
, 或 'base64'
。
如果給了 fd
值, ReadStream
將會(huì)忽略 path
參數(shù),而使用文件描述,這樣不會(huì)觸發(fā)任何 open
事件。
如果 autoClose
為 false,即使發(fā)生錯(cuò)誤文件也不會(huì)關(guān)閉,需要你來(lái)負(fù)責(zé)關(guān)閉,避免文件描述符泄露。如果 autoClose
是 true(默認(rèn)值),遇到 error
或 end
,文件描述符將會(huì)自動(dòng)關(guān)閉。
例如,從100個(gè)字節(jié)的文件里,讀取最少10個(gè)字節(jié):
fs.createReadStream('sample.txt', {start: 90, end: 99});
ReadStream
是 Readable Stream。
fd
{Integer} ReadStream 所使用的文件描述符。
當(dāng)創(chuàng)建文件的ReadStream時(shí)觸發(fā)。
返回一個(gè)新的寫(xiě)對(duì)象 (參見(jiàn) Writable Stream
)。
options
是一個(gè)對(duì)象,默認(rèn)值:
{ flags: 'w', encoding: null, fd: null, mode: 0666 }
options 也可以包含一個(gè) start 選項(xiàng),在指定文件中寫(xiě)入數(shù)據(jù)開(kāi)始位置。 修改而不替換文件需要 flags 的模式指定為 r+ 而不是默值的 w.
和之前的 ReadStream
類(lèi)似,如果 fd
不為空,WriteStream
將會(huì)忽略 path
參數(shù),轉(zhuǎn)而使用文件描述,這樣不會(huì)觸發(fā)任何 open
事件。
WriteStream
是 Writable Stream。
fd
{Integer} WriteStream 所用的文件描述符
打開(kāi) WriteStream file 時(shí)觸發(fā)。
目前寫(xiě)入的字節(jié)數(shù),不含等待寫(xiě)入的數(shù)據(jù)。
fs.watch()
返回的對(duì)象就是這個(gè)類(lèi).
停止觀察 fs.FSWatcher
對(duì)象中的更改。
event
{String} fs 改變的類(lèi)型
filename
{String} 改變的文件名 (if relevant/available)
當(dāng)監(jiān)聽(tīng)的文件或文件夾改變的時(shí)候觸發(fā),參見(jiàn)fs.watch。
error
{Error object}
錯(cuò)誤發(fā)生時(shí)觸發(fā)。