前言#
今天來(lái)看一個(gè)隱藏很深的函數(shù),隱藏很深只是我個(gè)人對(duì)這個(gè)函數(shù)的理解,為什么這么說(shuō)呢,原因就是我看到這個(gè)函數(shù)的第一眼根本不知道他有什么用,并且在查詢了各種資料之后依然查不到這個(gè)函數(shù)關(guān)于lua方面的應(yīng)用示例,后來(lái)我換了一個(gè)思路,開(kāi)始從源碼級(jí)別的方向去尋找,終于在C語(yǔ)言里找到了類似的函數(shù),并且大致搞清楚了這個(gè)函數(shù)的應(yīng)用方法。
有時(shí)候在程序運(yùn)行的時(shí)候,可能需要?jiǎng)?chuàng)建一個(gè)臨時(shí)文件,保存一些數(shù)據(jù),以后再用,而創(chuàng)建的時(shí)候有希望一次創(chuàng)建成功,不會(huì)覆蓋可能重名的文件,這時(shí)需要使用臨時(shí)文件。該函數(shù)的功能是產(chǎn)生一個(gè)唯一的文件名并且返回,這就是我所說(shuō)的這個(gè)函數(shù)的應(yīng)用示例。
內(nèi)容#
os.tmpname##
- 原型:os.tmpname()
- 解釋:返回一個(gè)臨時(shí)的文件名,這個(gè)文件使用之前必須被創(chuàng)建打開(kāi),并且在不需要的時(shí)候手動(dòng)刪除。
Usage##
- 首先我們先新建一個(gè)文件,將文件命名為tmpnametest.lua然后編寫(xiě)如下代碼:
local tmpfilename = os.tmpname()
tmpfilename = "."..tmpfilename
print("tmpfilename = "..tmpfilename)
-- 創(chuàng)建打開(kāi)文件
local myfile = io.open(tmpfilename,"w")
print(myfile)
-- 向文件中寫(xiě)入內(nèi)容
myfile:write("name=AlbertS\n");
myfile:write("age=22\n")
myfile:close();
-- 做了許多操作之后
-- ...
-- ...
-- 再次打開(kāi)文件
local secfile = io.open(tmpfilename,"r")
print(secfile)
-- 讀取文件內(nèi)容
local content = secfile:read("*a");
secfile:close();
print("\nfile content is:")
print(content)
-- 獲取正確的文件名
tmpfilename = string.sub(tmpfilename, 3, -2)
print("real tmpfilename = "..tmpfilename)
-- 刪除文件
local ret = os.remove(tmpfilename)
print("remove file ret:")
print(ret)
- 運(yùn)行結(jié)果:

tmpname.png
總結(jié)#
- 在一些系統(tǒng)中,比如POSIX中,這個(gè)函數(shù)可以使用返回的文件名創(chuàng)建一個(gè)文件來(lái)避免安全問(wèn)題(有些人會(huì)使用錯(cuò)誤的權(quán)限來(lái)說(shuō)的文件名和創(chuàng)建文件)但是你仍然需要在使用之前打開(kāi)文件,并且在不需要的時(shí)候刪除這個(gè)文件。
- 盡可能的,你選擇函數(shù)
io.tmpfile()會(huì)比較好,這個(gè)函數(shù)創(chuàng)建的文件會(huì)在程序退出時(shí)自動(dòng)刪除。 - 可能你會(huì)發(fā)現(xiàn)今天的代碼中出現(xiàn)了很多
IO庫(kù)中函數(shù),為了講清楚os.tmpname()的作用也是沒(méi)辦法,只能把他們先引入進(jìn)來(lái),不過(guò)后續(xù)我們會(huì)講解這些IO庫(kù)中的函數(shù)