FileNotFoundException: open failed: ENOENT (No such file or directory) 問題解決方案

這個問題定位了大半天,先坐下記錄。可能每個人遇到的問題情況不一樣,我先說下我出現的問題解決方案:將mkdir() 改成mkdirs() ,至於爲什麼,後面介紹。

今天測試找我,說項目中測試錄像直接crash了。我一臉懵圈,之前不都好好的嗎?這個項目之前別人在負責,之前也測試過沒問題。負責人離職後代碼移交給我了,怎麼到我手上就有問題?我很鬱悶的重現了下,還真是的!!!我思考了一下,我沒改這塊代碼啊,然後我update一份同事最後提交的版本代碼,發現也有這個問題,這讓我更不理解了,爲啥?爲啥?爲啥?

這塊代碼一直沒動,測試手機也是一樣的,不應該啊,最後我猜測可能是升級AS造成的,後面有空再去證實吧。

好了,廢話說到這,開始說正題:

既然有bug,那就去解決,既然能復現,那就看日誌。從報錯日誌裏我找到了FileNotFoundException: open failed: ENOENT (No such file or directory)。這很明顯是文件找不到啊,可是爲什麼呢?首先這是錄像時報的錯,那麼錄像找不到文件,就是說跟讀寫文件有關。

第一步,看到這個日誌,我的第一反應是權限申請了嗎?我仔細的看了下,權限有申請啊,AndroidManifest裏面有權限申請,因爲手機是Android6.0以上,所以我又看了下動態權限申請,也有啊,沒毛病。並且我從手機設置中查看了,已經有存儲權限了。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

第二步,既然權限已經申請了,那是路徑問題?好吧,再看路徑。代碼是通過獲取手機SD的存儲路徑,獲取的路徑也沒有毛病啊。代碼如下:

 

第三步,既然這兩個解決方案都沒用,那麼只能debug一步一步來了。我在debug下運行,發現報錯的地方是這裏:

那既然報錯了,肯定是文件不存在或者無效了,那文件在什麼地方創建的呢,當我找到文件創建的地方,打印了創建文件的結果,發現一直是false。

當我把mkdir()替換成mkdirs(),問題完美解決。他們的區別:

mkdir() 創建此抽象路徑名稱指定的目錄(及只能創建一級的目錄,且需要存在父目錄)

mkdirs() 創建此抽象路徑指定的目錄,包括所有必須但不存在的父目錄。(及可以創建多級目錄,無論是否存在父目錄)

到此,問題解決了,如果有疑問歡迎討論。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章