前言#
今天來看的這個函數看似普通,但卻花了我很多時間來調試,提前說明一下我使用的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
- 運行結果:
關于運行結果的思考:
由運行結果的前兩組可以看出:當要刪除的文件存在時,調用
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)
正如他的參數名字一樣,刪除文件是沒問題的,但是刪除目錄就看情況了。 - 當遇到函數的運行結果和自己的預期不一致時,多去源頭找找原因,比如翻翻官方文檔。