跳轉到內容

PSP 開發/檔案系統/迭代目錄

75% developed
來自華夏公益教科書,開放書籍,開放世界

迭代目錄是載入音樂播放器、影片播放器和圖片檢視器等資料夾資料的核心,它們依賴於搜尋目錄來列出可播放的檔案。遞迴可以與迭代一起使用,以檢視給定目錄中的所有檔案,甚至包括根目錄。檔案迭代是一種類似的方法,它包含一個 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 中的檔名沒有關聯的路徑,因此可以使用 中的 snprintf() 格式化字串 - 此外還可以使用 sceIoOpen() 開啟另一個檔案。

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);
}


華夏公益教科書