file??esp8266??nodeMCU
閑言碎語
這個(gè)系列距離上次發(fā)布文章已經(jīng)過去了三周了。其實(shí)我還沒有脫坑杀迹,只是沒有以前勤快而已亡脸。預(yù)計(jì)這個(gè)系列估計(jì)還可以水10篇文章左右押搪。之后開始發(fā)布一些綜合性強(qiáng)一點(diǎn)的文章,或許可以開多一個(gè)系列浅碾,在這之前先完成基礎(chǔ)(本)系列大州,還有就是Lua。額垂谢, 怎么感覺像是在寫2017年的計(jì)劃厦画。
模塊函數(shù)
這回介紹的是file模塊,需要注意的是滥朱,模塊不支持文件夾根暑,也就是說全部文件都在一個(gè)目錄下。nodeMCU擁有4M的內(nèi)置flash徙邻,可以用來存儲lua文件或者其他類型的文件排嫌。這個(gè)模塊的函數(shù)還是比較多的。模塊(文件系統(tǒng))支持內(nèi)置flash和外置SD卡的操作缰犁。斜體函數(shù)表示只支持flash淳地,加粗函數(shù)只支持SD卡,其余的函數(shù)flash和SD卡均支持帅容。
另外,具體涉及對文件訪問的函數(shù)颇象,操作上有兩種模式:基礎(chǔ)模式和對象模式,表格空行后面的所有函數(shù)并徘。遣钳。簡單的講基礎(chǔ)模式就是同一時(shí)刻只支持一個(gè)文件的操作,例如無法同時(shí)打開兩個(gè)文件麦乞。對象模式則可以耍贾,所有文件為獨(dú)立對象,可以使用對應(yīng)的函數(shù)實(shí)現(xiàn)獨(dú)立操作路幸。文檔中提到了,同時(shí)使用兩種模式會引發(fā)不可預(yù)期的后果付翁。
序號 | 函數(shù)名 | 參數(shù) | 返回值 |
---|---|---|---|
1 | file.chdir() | dir | true / false |
2 | file.exists() | filename | true / false |
3 | file.format() | 空 | 空 |
4 | file.fscfg () | 空 | flash addr简肴,size |
5 | file.fsinfo() | 空 | remaining,used百侧,total |
6 | file.list() | 空 | table {name:size} |
7 | file.mount() | ldrv[, pin] | Volume object |
8 | file.on() | event[, function()] | 空 |
9 | file.open() | filename, mode | object / 空 |
10 | file.remove() | filename | 空 |
11 | file.rename() | oldname, newname | true / false |
12 | file.close() | 空 | 空 |
13 | file.obj:close() | 空 | 空 |
14 | file.flush() | 空 | 空 |
15 | file.obj:flush() | 空 | 空 |
16 | file.read() | number / char | string |
17 | file.obj:read() | number / char | string |
18 | file.readline() | 空 | string |
19 | file.obj:readline() | 空 | string |
20 | file.seek() | [whence [, offset]] | position / 空 |
21 | file.obj:seek() | [whence [, offset]] | position / 空 |
22 | file.write() | string | true / 空 |
23 | file.obj:write() | string | true / 空 |
24 | file.writeline() | string | true / 空 |
25 | file.obj:writeline() | string | true / 空 |
函數(shù)雖然有點(diǎn)多砰识,但是對應(yīng)接觸過文件系統(tǒng)(比如fatfs)的人來說應(yīng)該不會陌生。在實(shí)踐之前簡單說一下開頭的幾個(gè)和flash有關(guān)的函數(shù)佣渴,沒有SD卡模塊可以試辫狼,關(guān)于SD卡的不講(以后有機(jī)會再補(bǔ))。
.chdir() 改變文件目錄辛润,目錄有/FLASH(內(nèi)置flash對應(yīng)這個(gè)目錄)膨处,/SD0,/SD1。當(dāng)目錄設(shè)置成/FLASH時(shí)真椿,在使用其他函數(shù)傳入文件名 為init.lua鹃答,則訪問的路徑是/FLASH/init.lua。
.exists() 這個(gè)很簡單突硝,判斷一個(gè)文件是否存在测摔。
.format() 你懂的,格式化解恰。注意锋八,不支持SD卡。
.remove() 移除文件护盈。
.rename()重命名挟纱。
實(shí)踐一下
查詢flash中有那些文件,可以使用.list()函數(shù)黄琼。函數(shù)返回一個(gè)table類型樊销,包括文件名和文件大小(存在0字節(jié))脏款。
l = file.list()
for name, size in pairs(l) do
print("name: " ..name..", size: "..size)
end
對于文件的訪問围苫,有兩種模式。區(qū)別在于前綴撤师,一個(gè)是 file.剂府,一個(gè)是obj:。obj對應(yīng)實(shí)際的變量名剃盾。當(dāng)只要訪問一個(gè)文件的時(shí)候可以用前者腺占,當(dāng)想復(fù)制文件或者同時(shí)打開兩個(gè)文件甚至多個(gè)的時(shí)候就只能用后者了。
對文件的訪問其實(shí)也很簡單痒谴。如果是要讀文件衰伯,一般的流程是打開文件(open),讀數(shù)據(jù)(read)积蔚,最后記得要關(guān)閉文件(close)意鲸。
如果是要寫文件,流程相對復(fù)雜一點(diǎn)尽爆。打開(或者創(chuàng)建)文件(open)怎顾,寫入數(shù)據(jù)(write),關(guān)閉文件(close)漱贱。如果寫入數(shù)據(jù)內(nèi)容比較多的話槐雾,則中間可能需要保存數(shù)據(jù)(flush),防止突然掉電導(dǎo)致數(shù)據(jù)丟失幅狮。因?yàn)槭褂脤懖僮鞯臅r(shí)候募强,數(shù)據(jù)并沒有立刻寫人存儲器株灸,只有使用flush或者關(guān)閉文件的時(shí)候才會。有時(shí)候?qū)懖僮魇峭粋€(gè)存在的文件里面寫钻注,可能還需要調(diào)整寫人位置蚂且,類似于移動光標(biāo)。
file.open("file.txt", "w")
for i=1, 3, 1 do
ch = "string_" .. i
file.writeline(ch)
end
file.close()
if file.open("file.txt") then
result = file.readline()
while result ~= nil
do
print(result)
result = file.readline()
end
end
file.close()
這里我們以寫的模式打開一個(gè)名為file.txt的文件幅恋,如果文件不存在則會先創(chuàng)建杏死。具體有這3*2中模式:
- "r": 讀(默認(rèn));
- "w": 寫捆交;
- "a": 追加模式淑翼;
- "r+": 更新模式,先前的內(nèi)容會保留品追;
- "w+": 更新模式玄括,先前的內(nèi)容會被擦除;
- "a+": 追加更新模式肉瓦,先前的內(nèi)容被保留遭京,但只能從末尾添加。
通常情況都是使用r和w這兩種模式泞莉。然后往文件寫入三行內(nèi)容哪雕。.writeline()會在字符串末尾添加一個(gè) \n,寫入內(nèi)容后會換行鲫趁。write()函數(shù)則不會換行斯嚎,需要自己換行。
寫完文件后挨厚,使用readline()來讀取寫入的內(nèi)容堡僻。這個(gè)函數(shù)會讀取一行內(nèi)容(以 \n 為一行,如果超過1024則讀取1024個(gè)字節(jié))疫剃。
fd = file.open("file.txt", "w")
if fd then
for i = 1, 3, 1 do
ch = "string_"..i
fd:writeline(ch)
end
fd:close()
fd = nil
end
fd = file.open("file.txt", "r")
if fd then
result = fd:read()
print(result)
end
fd:close()
這個(gè)例子本來是想用對象模式的钉疫。不過,open返回的竟然是個(gè)布爾值巢价,回頭有空再看看為什么返回一個(gè)布爾值牲阁。
這個(gè)例子使用了對象模式,如果你在運(yùn)行的時(shí)候提示fd是個(gè)布爾值的話蹄溉,需要重新編譯最新版本的固件。
.read()函數(shù)和readline()不一樣您炉。前者可以指定讀取多少字節(jié)或者讀到某個(gè)字符為止柒爵。如果什么都沒傳入,這讀取一個(gè)塊赚爵,默認(rèn)是1024字節(jié)棉胀。如果使用讀取字符的法瑟,但是一直沒有讀到該字符的,則讀夠一個(gè)塊就結(jié)束唁奢。
if file.open("file2.txt") then
file.seek("set", 2)
print(file.readline())
file.seek("cur", 4)
print(file.readline())
end
file.close()
.seek()函數(shù)很簡單霎挟,不過很好用÷榈В可以移動“光標(biāo)”在文件的位置酥夭,實(shí)現(xiàn)任意位置的讀寫操作。
最后來看一個(gè)文件拷貝的例子脊奋,這個(gè)例子需要用對象模式才可以實(shí)現(xiàn)熬北。先讀file.txt的內(nèi)容,在將內(nèi)容寫入copy.txt里面诚隙。
fw = file.open("copy.txt", "w")
fd = file.open("file.txt", "r")
if fd then
result = fd:read()
if fw then
fw:write(result)
fw:close()
fw = file.open("copy.txt", "r")
print(fw:read())
end
end
fd:close()
fw:close()
fd = nil
fw = nil
更多內(nèi)容
1讶隐、nodeMCU學(xué)習(xí)筆記–快速上手
2、nodeMCU學(xué)習(xí)筆記–tmr模塊
3久又、nodeMCU學(xué)習(xí)筆記–gpio模塊
4巫延、nodeMCU學(xué)習(xí)筆記–pwm模塊
5、nodeMCU學(xué)習(xí)筆記–uart(附透傳例子)
6地消、nodeMCU學(xué)習(xí)筆記–wifi模塊·上
7炉峰、nodeMCU學(xué)習(xí)筆記–wifi模塊·中
8、nodeMCU學(xué)習(xí)筆記–wifi模塊·下
9犯建、nodeMCU學(xué)習(xí)筆記–net模塊
10讲冠、nodeMCU學(xué)習(xí)筆記--ws2812模塊
11、nodeMCU學(xué)習(xí)筆記--mqtt模塊