在C程序中抽象文件系统的方法

Method for abstracting filesystems in a C program

本文关键字:文件系统 方法 抽象 程序      更新时间:2023-10-16

我正在SDL中启动一个程序,该程序显然需要为文件系统加载资源。我希望程序中的文件调用与平台无关。我最初的想法是定义一个宏(让我们称之为PTH作为路径),该宏是在预处理器中根据系统类型定义的,然后使用它在程序中进行文件调用。例如

SDL_LoadBMP(PTH("data","images","filename"));

将简单地转换为与文件系统相关的内容。

如果宏是可以接受的方法,那么这样的宏会是什么样子(我如何检查正在使用的系统,在宏中连接字符串?)

如果没有,可以接受的方式是什么?

Boost文件系统模块可能是您的最佳选择。它在路径上覆盖了"/"运算符,因此您可以执行以下操作。。。

ifstream file2( arg_path / "foo" / "bar" );

GLib有许多可移植的路径操作函数。如果您更喜欢C++,还有boost::filesystem。

没有必要将其作为宏。

一种常见的方法是抽象路径,使用正斜杠作为分隔符,因为这(几乎是意外的!)很好地映射到了很大一部分实际平台。对于那些没有的,您只需在文件系统实现层内部进行转换。

查看OS9 os.path.join(macpath)的python实现

def join(s, *p):
  path = s
  for t in p:
    if (not s) or isabs(t):
        path = t
        continue
    if t[:1] == ':':
        t = t[1:]
    if ':' not in path:
        path = ':' + path
    if path[-1:] != ':':
        path = path + ':'
    path = path + t
  return path

我不熟悉在SDL下在旧Mac上进行开发。游戏资源中的另一个替代方案是使用包文件格式,并将资源直接加载到内存中(例如map<string,SDL_Surface>)

因此,您将加载一个文件(甚至可能是一个zip,在加载时解压缩)

我只需在程序的启动代码中执行chdir(data_base_dir);的平台等效版本,然后使用形式为"images/filename"的相对unix样式路径。最后一个不起作用的系统是MacOS9,现在它已经完全不相关了。