12匈辱、nodeMCU學(xué)習(xí)筆記--file模塊

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

file.list()

對于文件的訪問围苫,有兩種模式。區(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模塊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末适瓦,一起剝皮案震驚了整個(gè)濱河市竿开,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玻熙,老刑警劉巖否彩,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嗦随,居然都是意外死亡列荔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門枚尼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贴浙,“玉大人,你說我怎么就攤上這事署恍∑槔#” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵盯质,是天一觀的道長袁串。 經(jīng)常有香客問我概而,道長,這世上最難降的妖魔是什么囱修? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任赎瑰,我火速辦了婚禮,結(jié)果婚禮上破镰,老公的妹妹穿的比我還像新娘餐曼。我一直安慰自己,他們只是感情好啤咽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布晋辆。 她就那樣靜靜地躺著,像睡著了一般宇整。 火紅的嫁衣襯著肌膚如雪瓶佳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天鳞青,我揣著相機(jī)與錄音霸饲,去河邊找鬼。 笑死臂拓,一個(gè)胖子當(dāng)著我的面吹牛厚脉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胶惰,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼傻工,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孵滞?” 一聲冷哼從身側(cè)響起中捆,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坊饶,沒想到半個(gè)月后泄伪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匿级,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年蟋滴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痘绎。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡津函,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孤页,到底是詐尸還是另有隱情尔苦,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站蕉堰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悲龟。R本人自食惡果不足惜屋讶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望须教。 院中可真熱鬧皿渗,春花似錦、人聲如沸轻腺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贬养。三九已至挤土,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間误算,已是汗流浹背仰美。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儿礼,地道東北人咖杂。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像蚊夫,于是被迫代替她去往敵國和親诉字。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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