我想实现一个非常简单的虚拟文件系统(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库不支持的功能,例如创建不同于文件系统到文件系统的目录?
谢谢
也许最简单的/清洁的实施方法是,创建两个单独的库,一个用于Windows,一个用于Linux,而不级联乱抛垃圾代码if
和switch
语句.这些库将实现在公共头中定义的相同功能.
另外,请记住,检查中的代码OS == something
将在所有系统上编译和链接,因此例如在linux上编译的库应该能够解析Windows系统调用...
我认为分离事物(不同的操作系统,不同的cpp文件)是最简单的解决方案.
编辑:
如果您使用的是C++,为什么不依靠流?标准库已经提供了您尝试实现的功能,并且可在所有平台上使用.
否则,这是Windows文件管理功能的链接.
第二次编辑:
如果您想要一个跨平台的文件系统库,支持其他目录创建,您可以检查boost文件系统库.
我不认为你可以按照你想要的方式为不同的操作系统编译模块.
// 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 }
你可以试试PhysicsFS库.