Lua os.remove()

前言#

今天來看的這個函數看似普通,但卻花了我很多時間來調試,提前說明一下我使用的lua源代碼的版本是5.1.4,版本這個東西很奇怪,明明這個版本很好用的函數,下個版本可能就刪除了,很奇怪吧!今天我們看的這個函數也和版本有關。

內容#


os.remove()

  • 原型:os.remove (filename)
  • 解釋:刪除文件或一個空目錄,若函數調用失敗則返加nil加上錯誤信息。

Usage

  • 首先我們新建一個文件命名為removetest.lua編寫如下代碼:
-- 刪除存在的文件
local rm_file = os.remove("remove_test.txt");
print("remove exist file ret:")
print(rm_file)
print("\n")

-- 刪除不存在的文件
local rm_notexist_file = os.remove("remove_test2.txt");
print("remove don't exist file ret:")
print(rm_notexist_file)
print("\n")

-- 刪除存在的目錄
local rm_dir = os.remove("mydir")
print("remove exist dir ret:")
print(rm_dir)
print("\n")

-- 刪除不存在的目錄
local rm_notexist_dir = os.remove("mydir2")
print("remove don't exist dir ret:")
print(rm_notexist_dir)
print("\n")

-- 終極殺招 調用系統命令刪目錄
local cmd_rm = os.execute("rd mydir")
print("remove exist dir with sys cmd ret:")
print(cmd_rm)
if cmd_rm == 0 then
    print("remove exist dir with sys cmd success")
end
  • 運行結果:
removefile.png
  • 關于運行結果的思考:

  • 由運行結果的前兩組可以看出:當要刪除的文件存在時,調用os.remove()會成功刪除文件并且返回true,而當要刪除的文件不存在時,函數返回nil這是符合預期結果的。

  • 由運行結果第3、4組可以看出無論要刪除的目錄是否存在,執行函數后均無法成功刪除目錄返回nil,這就值得思考了,明明文檔里寫了可以刪除目錄怎么到了這不行了呢,處于一臉懵逼的我不得不去查了一下lua的個各個版本的官方文檔,結果更懵逼了。

    • 先來看看Lua 5.0,這壓根就沒提到可以刪除目錄的事情啊?。?!

Deletes the file with the given name. If this function fails, it returns nil, plus a string describing the error.

- 然后是**Lua 5.1**,確實和我上面的解釋是一樣的。

Deletes the file or directory with the given name.Directories must be empty to be removed.If this function fails, it returns nil,plus a string describing the error.

  • 最后是完全相同的Lua 5.2、5.3,他居然提到了“POSIX systems”,那我使用的Windows豈不是沒用了。

Deletes the file (or empty directory, on POSIX systems)with the given name.If this function fails, it returns nil,plus a string describing the error and the error code.

  • 順著這個發現我又看了一下Lua 5.1版本的源碼,調用的是c語言的int remove(char * filename);函數,網上搜了一下這個函數的解釋為:“filename為要刪除的文件名,可以為一目錄。如果參數filename 為一文件,則調用unlink()處理;若參數filename 為一目錄,則調用rmdir()來處理”??墒鞘聦嵶C明這在windows系統上也是不成立的,我在C語言中使用int remove(char * filename);函數去刪除目錄,得到的結果是沒有權限,一開始我信了,然后我對要刪除的文件夾進行了瘋狂的權限修改,最終還是不能刪除,然后我就想如果我自己創建的文件夾,你總該讓我刪了吧,于是我又調用c語言的mkdir()函數來創建了一個文件夾,然后再刪除,得到的結果還是沒有權限,這次我明白了,在windows系統下int remove(char * filename);這個函數或許就沒有刪除目錄的功能,于是我釋然了,祭出一件法寶,調用system("rd mydir")函數成功將目錄刪除,小樣,還治不了你了!

總結#

  • os.remove(filename)正如他的參數名字一樣,刪除文件是沒問題的,但是刪除目錄就看情況了。
  • 當遇到函數的運行結果和自己的預期不一致時,多去源頭找找原因,比如翻翻官方文檔。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,549評論 0 17
  • 第一篇 語言 第0章 序言 Lua僅讓你用少量的代碼解決關鍵問題。 Lua所提供的機制是C不擅長的:高級語言,動態...
    testfor閱讀 2,725評論 1 7
  • Nginx API for Lua Introduction ngx.arg ngx.var.VARIABLE C...
    吃瓜的東閱讀 5,876評論 0 5
  • 今年年初,單位發海報準備開辦書法興趣班,初步統計報名人數,第一批次就報名100多人,這是舉辦方沒曾想到的;等到...
    高樂呵閱讀 271評論 0 0
  • 那年,終究是回不去了。我們把青春留在了那年,把夢想留在了那年。 那年,我還會做夢。夢里是我和他們的故事,愛了,也痛...
    默淺閱讀 185評論 0 1