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

时间:2011-06-28 16:12:54

标签: c++ c filesystems abstraction

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

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

只会转换为与文件系统相关的内容。

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

如果没有,这样做的可接受方式是什么?

5 个答案:

答案 0 :(得分:5)

Boost Filesystem module可能是你最好的选择。它对路径上的“/”运算符具有覆盖功能,因此您可以执行类似......的操作。

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

答案 1 :(得分:2)

GLib有一些portable path-manipulation functions.如果您更喜欢C ++,那么还有boost::filesystem

答案 2 :(得分:1)

没有必要将此作为宏。

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

答案 3 :(得分:0)

查看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

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

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

答案 4 :(得分:0)

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