跳转到内容

PSP 开发/文件系统

100% developed
来自维基教科书,开放的书籍,为开放的世界

文件系统包含许多可以访问的媒体。有些媒体不应该写入,因为这可能会导致系统损坏,就像使用内核模式的风险一样。使用内核模式时,这里限制的媒体不会被讨论,但会说明哪些应该被限制。

路径约定

[编辑 | 编辑源代码]

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
    • THEME
  • VIDEO

根目录是第一级文件夹。这些文件夹内部不再是根目录,而是俗称 "GAME 文件夹根目录",指的是 PSP/GAME 文件夹中的所有内容。

PPSSPP 记忆棒

[编辑 | 编辑源代码]

从 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

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()。

工作示例

[编辑 | 编辑源代码]
  • 没有工作示例


华夏公益教科书