C / C ++中的简单虚拟文件系统

时间:2009-09-01 09:50:21

标签: c++ filesystems

我想实现一个非常简单的虚拟文件系统(VFS),它支持一些基本的文件系统操作,如fwrite, fopen,fput等.VFS是一些在具体操作系统之上的抽象层,例如Windows,Linux等。现在假设,那 fopen界面看起来像这样

FILE VFS_File_Open( const unsigned char* strFile, int flags );

现在我想知道如何在这个界面的实际实现中做出区分 我正在谈论的文件系统。是否有C语言告诉我应用程序正在运行的操作系统 我可以这样做:

FILE VFS_File_Open( const unsigned char strFile, int flags )
{
int OS = getOSID();

if (0S == 1)
  //implement here the system calls required to open a file on a WIN OS
else if (OS == 2)
  //implement here the system calls required to open a file on a Linux OS
etc  
}

编辑:

现在我想知道是否有人知道我在哪里可以找到系统调用Windows的文件操作?很容易找到它们用于Linux,但我很难找到类似于Windows的东西,例如我会对打开文件,写文件等的系统调用感兴趣。

另一方面:C stdio.h提供了许多支持IO操作,如

FILE * fopen (const char *filename, const char *opentype)

换句话说,我不需要在我的VFS中重新实现fopen例程,因为Gnu C库负责处理它正在处理的操作系统,是吗?我只需要实现stdio库不支持的功能,例如创建目录,从文件系统到文件系统不同?

由于

6 个答案:

答案 0 :(得分:13)

也许最简单/最干净的实现是创建两个独立的库,一个用于Windows,一个用于linux,而不会使用级联ifswitch语句乱丢代码。这些库将实现相同的功能,在公共头中定义。

另外,请记住,检查OS == something中的代码将在所有系统上进行编译和链接,例如,在linux上编译的库应该能够解析windows系统调用...

我认为分离事物(不同的操作系统,不同的cpp文件)是最简单的解决方案。

编辑

如果您使用的是C ++,为什么不依靠streams?标准库已经提供了您尝试实现的功能,并且可以在所有平台上使用 否则,这是指向Windows File Management Functions的链接。

第二次编辑

如果您想要一个跨平台的文件系统库,支持其他目录创建,您可以查看boost filesystem library

答案 1 :(得分:7)

我认为你不能按照你想要的方式为不同的操作系统编译模块。

// Make the distinction at compile time,

FILE VFS_File_Open( const unsigned char strFile, int flags )
{
#ifdef _WINDOWS
    //implement here the system calls required to open a file on a WIN OS
#endif
#ifdef _LINUX
    //implement here the system calls required to open a file on a Linux OS
#endif
    etc
}

答案 2 :(得分:6)

您可以尝试使用PhysicsFS库。

答案 3 :(得分:1)

实际上实现了这一点,所以从这里的经验来看:

首先要做的是使用类。没有fopen()等价物。如果有旗帜,它们将成为一个枚举。文件名现在是wchar_t。

要做的第二件事是分解文件类中依赖于操作系统的部分。它们应该采用不同的方法。您将这些移动到一个单独的文件。对于您拥有的每个操作系统,将有一个不同的文件实现相同的方法。链接应用程序时,您知道目标体系结构,并且可以选择正确的版本。

答案 4 :(得分:0)

标准C没有这样的功能。请注意,“具体操作系统”的概念也有点含糊:Windows XP和Windows Vista是相同的“具体操作系统”,还是不同的? CentOS和Ubuntu是相同的OS,还是不同的OS?

显然,您只是在寻找API差异,因此在大多数情况下,您可能会忽略版本差异和分布差异(尽管Windows和Linux都会不时地增加新的系统调用)。在这种情况下,最好预处理条件编译 - 因为特定于Linux的调用的代码甚至不能在Windows上编译。

传统上,系统编译器预定义了各种宏。以下是各个系统上的一些此类宏:_WIN32__linux__linux____AIX____hpux,...如果您需要识别具体系统,你应该再问一下。

答案 5 :(得分:0)

如果您正在寻找一种方法从您正在使用的文件系统的属性(路径分隔符等)中抽象自己,并且如果您对仅使用C ++的解决方案感到满意,请查看{{ 3}}

路径可以便携式通用路径格式(基本上是POSIX格式)指定,并自动转换为原生格式:

path my_path( "some_dir/file.txt" );

可以使用/运算符将元素连接到路径上,然后可以直接使用结果打开文件:

ifstream file1( my_path / "foo/bar" );

此外,此功能是技术报告2的一部分,这意味着它可能会进入标准库。