C++ “理解”;创建一个允许映射任意目录的虚拟文件系统;用于FTP服务器项目

C++ “理解”;创建一个允许映射任意目录的虚拟文件系统;用于FTP服务器项目,c++,vfs,ftp-server,C++,Vfs,Ftp Server,免责声明:这是家庭作业;我不需要解决方案。 此外,除了c/c++标准库之外,没有其他库可用。 我正在寻找一个正确的方向,以了解我指定的学期项目(创建虚拟FTP服务器)的这部分工作要求我做什么: 服务器允许创建虚拟文件系统。所谓虚拟文件系统,我们指的是服务目录到文件系统上真实目录的映射。例如,客户端树将如下所示:/home/user1映射到/mnt/x/home/user1/www映射到/var/cache/www/home/user_list.txt映射到/var/ftpclient/user_

免责声明:这是家庭作业;我不需要解决方案。

此外,除了c/c++标准库之外,没有其他库可用。

我正在寻找一个正确的方向,以了解我指定的学期项目(创建虚拟FTP服务器)的这部分工作要求我做什么:

服务器允许创建虚拟文件系统。所谓虚拟文件系统,我们指的是服务目录到文件系统上真实目录的映射。例如,客户端树将如下所示:/home/user1映射到/mnt/x/home/user1/www映射到/var/cache/www/home/user_list.txt映射到/var/ftpclient/user_list.txt用户将看到/home/user1目录和/www目录以及文件/home/user_list.txt

我向我的讲师提出了以下问题:

/home/user1->/mnt/x/home/user1
/www->/var/cache/www
、和
/var/cache/www/home/user_list.txt->/var/ftpclient/user_list.txt
是唯一需要支持的目录映射吗(因此每个用户将有两个目录和一个文件,如图所示,它们是自动创建的)

答复如下:

这些映射只是示例设置。您的解决方案应该能够 以类似的方式将任何对象映射到任何对象

根据我目前的理解,我只需要允许FTP服务器的用户访问显式映射的目录和文件(通过配置文件指定)。这可能意味着映射类似于
/home->/home/users
(因此所有用户都会看到它们位于FTP文件的伪根目录中,例如用户Bob看到
/home/Bob/


另外,我需要使用哪种API来支持FTP命令,如
ls
cd
,这些命令可以与真正的不协调文件系统一起工作?

您正在创建自己的FTP服务器(或至少是其中的一部分)。它需要解决将
/home/bob
转换为
/home/users/bob
的问题。我相信,您要做到这一点的方法是,如果有人键入
cd/home/bob
,您只需将传入的文件位置转换为一个函数,该函数将用户提供的pat(在本例中为
/home/bob
)转换为“真实的”表单(
/home/users/bob
),然后将其传递给实际更改目录的
chdir
函数。要使
pwd
ls
等内容显示正确的路径,您需要“记住您所在的位置”(请记住,可能有人想做
cd../joe
cd../tom/./././mats/./joe
,或
cd..;cd joe
移动到
/home/joe
,这一切都应该[对我的打字进行模块化]翻译为
/home/users/joe
但显示为
/home/joe
——换句话说,您的
cd
需要了解当前目录
和父目录
才能移动),或者进行“反向翻译”这需要
/home/users/joe
并产生
/home/joe
。我目前认为后者更简单,但我还没有完全解决这个问题

可能有几种解决方案可供遵循,但“匹配字符串开头”和在绝对路径中工作将起作用,除非您想做非常复杂的事情,并且不需要用户做非常复杂的事情,例如,如果我们有以下映射:

/home -> /mnt/x/home     (e.g /home/bob becomes /mnt/x/home/bob)
/www  -> /var/cache/www    (e.g /www/index.html becomes /var/cache/www/index.html)
现在,如果用户要执行以下操作:

cd /home/bob/../../www/    (could be worse with more . and .. mixed in)
然后,您需要真正了解您的位置,并将fix-up../.转换为/再次。[当然,使用
cd/home/bob
然后
cd..
cd www
可能会造成类似的问题]

我想澄清一下,你们的讲师是否真的要求这样做


如果不是必需的,则匹配以
/
开头的任何内容的开头(其他所有内容,只需不加更改地传递到
chdir

最后一个问题最简单:使用Boost文件系统库,它具有您需要的类型,例如文件路径

对于第一个问题,想法是
GET/home/user_list.txt
返回
/var/ftpclient/user_list.txt
的内容。这意味着您首先需要将虚拟名称转换为真实名称(这里可能会有一些幻想,但基本上您希望检查翻译表中是否出现虚拟名称的前缀。幻想包括处理未找到名称的情况)。其次,使用真实名称打开该文件,读取其内容,并将其返回给客户端