【问题标题】:Method for abstracting filesystems in a C program在 C 程序中抽象文件系统的方法
【发布时间】:2011-06-28 16:12:53
【问题描述】:

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

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

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

如果宏是执行此操作的公认方式,那么此类宏会是什么样子(如何检查正在使用的系统,在宏中连接字符串?)

如果不是,那么可接受的执行方式是什么?

【问题讨论】:

  • 您是在寻找独立于文件系统类型(例如 ext3、ReiserFS、btrfs)还是独立于平台(例如 Windows 和 Mac 和 Linux)
  • 除非有一些我不知道的警告,即从外来文件系统调用文件而不是仅使用标准 Unix 路径,否则我会说平台无关。
  • 我认为,一个宏可以在两者上都起作用,就像预处理器确定的斜杠交换函数一样。这很丑陋,但显然并非不可能,所以我宁愿为两者都有一个解决方案。
  • @Scribble:它们是两种不同的语言。无论您预先假设什么解决方案,可用的解决方案在它们之间会有很大差异。请选择一个。
  • 答案中都给出了相关的解决方案,所以我相信没有理由选择。不过感谢您的意见。

标签: c++ c filesystems abstraction


【解决方案1】:

Boost Filesystem module 可能是您最好的选择。它覆盖了路径上的“/”运算符,因此您可以执行...

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

【讨论】:

  • +1,如果您忽略“C”标签,这是一个很好的建议。
  • @awoodland:在我看到我通常做的 C++ 标签时。
  • 我想要一些在 C 中也能工作的东西(这就是我想到宏的原因),但 Blindy 让我想起了 glib,它在 C 中工作得很好。
【解决方案2】:

GLib 有多个portable path-manipulation functions.,如果你更喜欢C++,还有boost::filesystem

【讨论】:

  • 谢谢,我实际上知道 glib,但它让我忘记了。不过,我确实更喜欢支持 C++。
  • glib 在 C++ 中受支持,因为您可以使用它。 boost::filesystem 确实更好用,如果你不需要 C 支持
  • +1,因为您的答案很有帮助且相关,并且涉及 c 和 c++,但 Andrew White 的音调更详细,并且与大多数编码人员(C++)相关,所以我必须给他支票,对不起。
【解决方案3】:

没有必要把它作为一个宏。

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

【讨论】:

  • 文件系统实现层是什么意思?
【解决方案4】:

看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 进行开发。游戏资源中的另一种选择是使用打包文件格式,将资源直接加载到内存中(例如地图)

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

【讨论】:

    【解决方案5】:

    我会在程序的启动代码中简单地使用平台等效版本的chdir(data_base_dir);,然后使用"images/filename" 形式的相对unix 样式路径。最后一个无法使用的系统是 MacOS 9,现在完全无关紧要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多