我想实现一个非常简单的虚拟文件系统(VFS),它支持像FWRITE,FOPEN,fput等一些基本的文件系统操作的VFS是一些具体的OS之上的抽象层,如Windows和Linux等。现在假设,这则fopen界面看起来是这样的
FILE VFS_File_Open( const unsigned char* strFile, int flags );
现在我想知道怎样才能在实际执行这个接口哪些文件系统,我说的区别做。 有没有用C的东西,告诉我在哪个OS的应用程序正在运行,这样我可以做这样的事情:
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)
换句话说,我没有重新实现常规的fopen在我VFS为GNU C库大约需要何种操作系统它在处理与照顾,是这样吗? 我只是要实现一个不受stdio库支持的功能,例如创建目录,从文件系统的不同而不同文件系统?
谢谢
也许最简单的/清洁的实施方法是,创建两个单独的库,一个用于Windows,一个用于Linux,而不级联乱抛垃圾代码if
和switch
语句。 库将执行相同的功能,在一个共同的报头定义。
同时,请记住您的支票中的代码OS == something
会被编译和链接在所有系统上,所以如在Linux上编译库应该能够解决窗口系统调用...
我觉得事情分开(不同的操作系统,不同cpp文件)是最简单的解决方案。
编辑 :
如果您使用的是C ++,为什么不只依靠流 ? 标准库已提供您正在尝试执行并适用于所有平台的功能。
否则,这里有一个链接的Windows文件管理功能 。
第二个编辑 :
如果你想要一个跨平台的文件系统库,除其他事情目录创建支持,您可以检查提高文件系统库 。
我不认为你可以编译不同的操作系统的模块,你想要的方式。
// 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
}
实际上实现了这个,从经验在这里这样:
要做的第一件事是使用类。 没有fopen()
等同。 如果有标志,他们将是一个枚举。 文件名是时下wchar_t的。
做的第二件事是因素你的文件类的依赖于操作系统的部分。 他们应该是在单独的方法。 您移动这些到一个单独的文件。 对于每一个你有操作系统,会有不同的文件执行同样的方法。 当您链接您的应用程序,你知道自己的目标架构,你可以选择正确的版本。
标准C有没有这样的功能。 请注意,“具体的OS”的概念也有点含糊:是的Windows XP和Windows Vista相同的“混凝土OS”,或者是不同的? 是的CentOS和Ubuntu相同的操作系统,或者是不同的?
显然,你只是在寻找API的差异,所以在大多数情况下,你大概可以忽略版本差异和分布的差异(尽管Windows和Linux长出新的系统调用不时)。 在这种情况下,最好是预处理器条件编译 - 从做Linux特有的调用甚至不会在Windows编译代码。
传统上,系统编译器有不同的宏预定义。 这里有几个这样的宏,在各自的系统: _WIN32
, __linux
, __linux__
, __AIX__
, __hpux
,...如果你需要确定一个特定的系统,你应该SO再问。
如果你自己从文件系统的性能在寻找一种方式来抽象你使用(路径分隔符等),如果你很高兴与C ++ -唯一的解决办法,看看Boost.Filesystem的 。
路径可以在便携式通用路径格式 (基本上POSIX格式)来指定和自动转换为本地格式:
path my_path( "some_dir/file.txt" );
单元能使用被级联到路径上/
操作者,并且将结果然后可以直接被用来打开一个文件:
ifstream file1( my_path / "foo/bar" );
更重要的是,这个功能是技术报告2的一部分,这意味着它可能会使其进入标准库。