PSP 開發/檔案系統
檔案系統包含許多可以訪問的媒體。有些媒體不應該寫入,因為這可能會導致系統損壞,就像使用核心模式的風險一樣。使用核心模式時,這裡限制的媒體不會被討論,但會說明哪些應該被限制。
PSP 在路徑方面更像 Unix 系統。一般的路徑約定使用正斜槓 "/" 來分隔協議、目錄和檔案。所有內容都應使用大寫字母,同樣,任何檔案或目錄都會被引用,無論其大小寫 - 它不區分大小寫。這意味著 "BIN" 與 "bIN" 和 "bIn" 相同。將所有內容保持一致並使用大寫字母符合此規則是有意義的,因此最好將檔案和資料夾大寫。
協議決定被引用的媒體。有很多媒體可以被引用。以下是一些安全使用的常用媒體列表。
- umd0:/ - UMD 光碟
- ms0:/ - 記憶棒
- disc0:/ - UMD 光碟
請遠離
- lflash:/
- flash0:/
- flash1:/
記憶棒的根目錄是所有資料夾的基礎。在 Windows 中,這通常是你的 C:/ 驅動器。但是,對於 PSP 來說,它是記憶棒。記憶棒在插入電腦時可能會列出任何協議。根據你的 PNP 設定,它可能無法掛載,需要手動掛載。
這是你的記憶棒中包含韌體 6.60 PSP 1000 CFW 的預設資料夾列表。
- MP_ROOT
- 100MNV01
- 101ANV01
- MUSIC
- PICTURE
- PSP
- COMMON
- GAME
- RSSCH
- SAVEDATA
- SYSTEM
- BROWSER
- INFOBOARD
- TEMP
- IMAGE
- TEMP
- THEME
- VIDEO
根目錄是第一級資料夾。這些資料夾內部不再是根目錄,而是俗稱 "GAME 資料夾根目錄",指的是 PSP/GAME 資料夾中的所有內容。
從 PPSSPP 1.4 開始,對修復進行了改進,使自制軟體更容易測試。將包含專案的資料夾放到 PPSSPP/Memstick/PSP/GAME 中,將導致向 main() 傳遞正確的引數 (ms0:/PSP/GAME/APPLICATION/EBOOT.PBP),而不是 umd0:/。後一種路徑是為了支援 ISO PBP 和 PS1 遊戲。這意味著可以在 PPSSPP 上模擬 UMD,但在真實 PSP 上,必須存在 CFW 或已簽名的 PBP。以下是 PPSSPP 預設資料夾列表,它與 PSP 的初始列表不同。
- MUSIC
- VIDEO
- PICTURE
- PSP
- COMMON
- GAME
- SAVEDATA
- SYSTEM
絕對路徑包含一個協議,該協議直接透過所有路徑連結到檔案或目錄。絕對連結是最安全的,因為它們指向一個位置,無論當前工作目錄 (CWD) 是什麼。建議在必要時使用絕對路徑。
示例路徑
- umd0:/FOLDER/file.txt
- ms0:/PSP/GAME/APPLICATION/EBOOT.PBP
- ms0:/MUSIC/HomeBySafia.mp3
相對路徑使用 CWD 並根據它構建路徑。例如,如果當前工作目錄是 ms0:/PSP/GAME/APPLICATION,則相對路徑可以引用 GAME/OTHER_APPLICATION。為此,使用一系列雙點來表示上級目錄,但是,使用此方法不需要使用上級目錄,因為它也是基於 CWD 構建的。這意味著 ms0:/PSP/GAME/APPLICATION 可以是 CWD,並且要引用一個名為 FILES 的內部資料夾,只需要 /FILES。
檔案系統示例路徑 (ms0:/)
- MUSIC
- PSP
- GAME
- APPLICATION
- FILES
- OTHER_APPLICATION
- FILES
- DATA
- APPLICATION
- GAME
CWD 示例路徑 (ms0:/PSP/GAME/APPLICATION)
- /FILES
- ../OTHER_APPLICATION
- ../OTHER_APPLICATION/FILES
- ../OTHER_APPLICATION/DATA
- ../../../MUSIC
一個常見的技巧是使用字面拼接策略,它與你 malloc 或 calloc 一些記憶體並執行字串拼接的策略相對應 - 使用動態記憶體。字面拼接不在動態記憶體上,而在自動堆疊上。
避免字面拼接的 Malloc/Calloc
// make some zero terminated literals
const char* abc = "abc";
const char* onetwothree = "123";
// concat them by specifying variable
const char* abc_onetwothree = abc onetwothree;
printf(abc_onetwothree); //> abc123
絕對路徑是最好的選擇。在 PSP 中修改 CWD 有點麻煩。當檢測 EBOOT.PBP 來自的媒體時,它會更加麻煩。如 Hello World 應用程式 中所述,傳遞給 main() 的引數將告訴你 EBOOT.PBP 的絕對路徑。比對它進行子字串操作並以此為基礎構建更好的方法是使用 路徑拼接。這使得建立絕對路徑變得容易。問題是資料夾名稱取決於使用者是否編輯了名稱。
示例
#define TITLE "APPLICATION"
#define ROOT "ms0:/PSP/GAME/" TITLE "/"
使用這種方法還可以在 PSP_MODULE_INFO() 函式內放置 TITLE 宏。如果模擬 UMD,路徑將是 umd0:/,而不是直接來自記憶棒 (ms0:/)。
PSP 有 當前工作目錄 (CWD) 的概念。這始終是 PBP 檔案的啟動位置。在模擬 UMD 時,CWD 是 EBOOT.PBP 中的根資料夾,即 umd0:/。為了設定 CWD,PSPDEV 提供了 sceIoChdir() 函式。sceIoChdir() 接收一個指向新路徑的 const char*,該路徑將成為 CWD。設定後,無法使用提供的 sceIo* 函式讀取 CWD。此類函式在 unistd.h 中被稱為 getcwd(),在 windows.h 中被稱為 _getcwd()。
- 沒有工作示例