我想实现一个非常简单的虚拟文件系统(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库不支持的功能,例如创建目录,从文件系统到文件系统不同?
由于
答案 0 :(得分:13)
也许最简单/最干净的实现是创建两个独立的库,一个用于Windows,一个用于linux,而不会使用级联if
和switch
语句乱丢代码。这些库将实现相同的功能,在公共头中定义。
另外,请记住,检查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的一部分,这意味着它可能会进入标准库。