在C / C简单的虚拟文件系统++(Simple Virtual Filesystem in C/C

2019-07-04 06:09发布

我想实现一个非常简单的虚拟文件系统(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库支持的功能,例如创建目录,从文件系统的不同而不同文件系统?

谢谢

Answer 1:

也许最简单的/清洁的实施方法是,创建两个单独的库,一个用于Windows,一个用于Linux,而不级联乱抛垃圾代码ifswitch语句。 库将执行相同的功能,在一个共同的报头定义。

同时,请记住您的支票中的代码OS == something会被编译和链接在所有系统上,所以如在Linux上编译库应该能够解决窗口系统调用...

我觉得事情分开(不同的操作系统,不同cpp文件)是最简单的解决方案。

编辑

如果您使用的是C ++,为什么不只依靠流 ? 标准库已提供您正在尝试执行并适用于所有平台的功能。
否则,这里有一个链接的Windows文件管理功能 。

第二个编辑

如果你想要一个跨平台的文件系统库,除其他事情目录创建支持,您可以检查提高文件系统库 。



Answer 2:

我不认为你可以编译不同的操作系统的模块,你想要的方式。

// 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
}


Answer 3:

你可以尝试PhysicsFS库。



Answer 4:

实际上实现了这个,从经验在这里这样:

要做的第一件事是使用类。 没有fopen()等同。 如果有标志,他们将是一个枚举。 文件名是时下wchar_t的。

做的第二件事是因素你的文件类的依赖于操作系统的部分。 他们应该是在单独的方法。 您移动这些到一个单独的文件。 对于每一个你有操作系统,会有不同的文件执行同样的方法。 当您链接您的应用程序,你知道自己的目标架构,你可以选择正确的版本。



Answer 5:

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

显然,你只是在寻找API的差异,所以在大多数情况下,你大概可以忽略版本差异和分布的差异(尽管Windows和Linux长出新的系统调用不时)。 在这种情况下,最好是预处理器条件编译 - 从做Linux特有的调用甚至不会在Windows编译代码。

传统上,系统编译器有不同的宏预定义。 这里有几个这样的宏,在各自的系统: _WIN32__linux__linux____AIX____hpux ,...如果你需要确定一个特定的系统,你应该SO再问。



Answer 6:

如果你自己从文件系统的性能在寻找一种方式来抽象你使用(路径分隔符等),如果你很高兴与C ++ -唯一的解决办法,看看Boost.Filesystem的 。

路径可以在便携式通用路径格式 (基本上POSIX格式)来指定和自动转换为本地格式:

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

单元能使用被级联到路径上/操作者,并且将结果然后可以直接被用来打开一个文件:

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

更重要的是,这个功能是技术报告2的一部分,这意味着它可能会使其进入标准库。



文章来源: Simple Virtual Filesystem in C/C++