file??esp8266??nodeMCU
閑言碎語
這個系列距離上次發布文章已經過去了三周了。其實我還沒有脫坑,只是沒有以前勤快而已。預計這個系列估計還可以水10篇文章左右。之后開始發布一些綜合性強一點的文章,或許可以開多一個系列,在這之前先完成基礎(本)系列,還有就是Lua。額, 怎么感覺像是在寫2017年的計劃。
模塊函數
這回介紹的是file模塊,需要注意的是,模塊不支持文件夾,也就是說全部文件都在一個目錄下。nodeMCU擁有4M的內置flash,可以用來存儲lua文件或者其他類型的文件。這個模塊的函數還是比較多的。模塊(文件系統)支持內置flash和外置SD卡的操作。斜體函數表示只支持flash,加粗函數只支持SD卡,其余的函數flash和SD卡均支持。
另外,具體涉及對文件訪問的函數,操作上有兩種模式:基礎模式和對象模式,表格空行后面的所有函數。。簡單的講基礎模式就是同一時刻只支持一個文件的操作,例如無法同時打開兩個文件。對象模式則可以,所有文件為獨立對象,可以使用對應的函數實現獨立操作。文檔中提到了,同時使用兩種模式會引發不可預期的后果。
序號 | 函數名 | 參數 | 返回值 |
---|---|---|---|
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 / 空 |
函數雖然有點多,但是對應接觸過文件系統(比如fatfs)的人來說應該不會陌生。在實踐之前簡單說一下開頭的幾個和flash有關的函數,沒有SD卡模塊可以試,關于SD卡的不講(以后有機會再補)。
.chdir() 改變文件目錄,目錄有/FLASH(內置flash對應這個目錄),/SD0,/SD1。當目錄設置成/FLASH時,在使用其他函數傳入文件名 為init.lua,則訪問的路徑是/FLASH/init.lua。
.exists() 這個很簡單,判斷一個文件是否存在。
.format() 你懂的,格式化。注意,不支持SD卡。
.remove() 移除文件。
.rename()重命名。
實踐一下
查詢flash中有那些文件,可以使用.list()函數。函數返回一個table類型,包括文件名和文件大小(存在0字節)。
l = file.list()
for name, size in pairs(l) do
print("name: " ..name..", size: "..size)
end
對于文件的訪問,有兩種模式。區別在于前綴,一個是 file.,一個是obj:。obj對應實際的變量名。當只要訪問一個文件的時候可以用前者,當想復制文件或者同時打開兩個文件甚至多個的時候就只能用后者了。
對文件的訪問其實也很簡單。如果是要讀文件,一般的流程是打開文件(open),讀數據(read),最后記得要關閉文件(close)。
如果是要寫文件,流程相對復雜一點。打開(或者創建)文件(open),寫入數據(write),關閉文件(close)。如果寫入數據內容比較多的話,則中間可能需要保存數據(flush),防止突然掉電導致數據丟失。因為使用寫操作的時候,數據并沒有立刻寫人存儲器,只有使用flush或者關閉文件的時候才會。有時候寫操作是往一個存在的文件里面寫,可能還需要調整寫人位置,類似于移動光標。
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()
這里我們以寫的模式打開一個名為file.txt的文件,如果文件不存在則會先創建。具體有這3*2中模式:
- "r": 讀(默認);
- "w": 寫;
- "a": 追加模式;
- "r+": 更新模式,先前的內容會保留;
- "w+": 更新模式,先前的內容會被擦除;
- "a+": 追加更新模式,先前的內容被保留,但只能從末尾添加。
通常情況都是使用r和w這兩種模式。然后往文件寫入三行內容。.writeline()會在字符串末尾添加一個 \n,寫入內容后會換行。write()函數則不會換行,需要自己換行。
寫完文件后,使用readline()來讀取寫入的內容。這個函數會讀取一行內容(以 \n 為一行,如果超過1024則讀取1024個字節)。
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()
這個例子本來是想用對象模式的。不過,open返回的竟然是個布爾值,回頭有空再看看為什么返回一個布爾值。
這個例子使用了對象模式,如果你在運行的時候提示fd是個布爾值的話,需要重新編譯最新版本的固件。
.read()函數和readline()不一樣。前者可以指定讀取多少字節或者讀到某個字符為止。如果什么都沒傳入,這讀取一個塊,默認是1024字節。如果使用讀取字符的,但是一直沒有讀到該字符的,則讀夠一個塊就結束。
if file.open("file2.txt") then
file.seek("set", 2)
print(file.readline())
file.seek("cur", 4)
print(file.readline())
end
file.close()
.seek()函數很簡單,不過很好用。可以移動“光標”在文件的位置,實現任意位置的讀寫操作。
最后來看一個文件拷貝的例子,這個例子需要用對象模式才可以實現。先讀file.txt的內容,在將內容寫入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
更多內容
1、nodeMCU學習筆記–快速上手
2、nodeMCU學習筆記–tmr模塊
3、nodeMCU學習筆記–gpio模塊
4、nodeMCU學習筆記–pwm模塊
5、nodeMCU學習筆記–uart(附透傳例子)
6、nodeMCU學習筆記–wifi模塊·上
7、nodeMCU學習筆記–wifi模塊·中
8、nodeMCU學習筆記–wifi模塊·下
9、nodeMCU學習筆記–net模塊
10、nodeMCU學習筆記--ws2812模塊
11、nodeMCU學習筆記--mqtt模塊