PSP 開發/檔案系統/迭代目錄
外觀
迭代目錄是載入音樂播放器、影片播放器和圖片檢視器等資料夾資料的核心,它們依賴於搜尋目錄來列出可播放的檔案。遞迴可以與迭代一起使用,以檢視給定目錄中的所有檔案,甚至包括根目錄。檔案迭代是一種類似的方法,它包含一個 SceIoStat 結構體,用於開啟和修改檔案。
必須開啟目錄才能檢視其內容。PSPDEV 提供 sceIoDopen(),而不是用於檔案的 sceIoOpen()。但是,從呼叫中返回了檔案控制代碼,並接受 const char*。如果數字小於或等於 0,則必須存在錯誤。
const char* src = ROOT;
int uid = sceIoDopen(src);
開啟的目錄,與檔案一樣,必須關閉。可以開啟多個目錄,但是,除非使用遞迴,否則建議不要同時開啟多個目錄。還建議不要在程式開始時開啟它們,並在程式結束之前一直保持開啟狀態。PSP 是一款功能強大的機器,但是諸如記憶體洩漏,尤其是使用緩衝區的 IO 中的記憶體洩漏之類的糟糕做法,會積聚成記憶體浪費、程式碼難以管理和功能低下。可以使用 SceIoDclose() 函式關閉目錄。它返回一個整數,表示是否存在故障,應進行處理。
int status = sceIoDclose(uid);
目錄中包含檔案。SceIoDirent 結構體代表“目錄條目”,其中包含有關目錄的資訊。為了將資訊載入到此結構體中,需要呼叫 sceIoDread() 函式。這一次只能獲取一個檔案。這意味著 sceIODread() 函式將從目錄中載入一個檔案的資料到結構體中。可以使用 while 迴圈遍歷所有檔案。還有一個 SceIoStat,它告訴資料夾的大小和時間屬性。由於 SceIoDirent 中的檔名沒有關聯的路徑,因此可以使用
void get_files() {
const char* src = ROOT;
// open the directory
int uid = sceIoDopen(src);
if(uid <= 0)
crash(uid, "Directory Iteration", "Failure or empty directory");
printf("Opened, reading directory.\n");
// iterate over the directory for files, print name and size of array (always 256)
// this means you use strlen() to get length of file name
SceIoDirent dir;
char temp_name[PATH_MAX]; // 4096 is linux's forced policy
while(sceIoDread(uid, &dir) > 0) {
printf("Read `%s` (%d) \n", dir.d_name, sizeof(dir.d_name));
// format a path, print it (remember to include stdio.h)
snprintf(temp_name, PATH_MAX, "%s%s", src, dir.d_name);
printf("@%s\n", temp_name);
}
printf("Done reading directory.\n");
// clean up
sceIoDclose(uid);
}