了解 FTP 服务器项目的"create a virtual filesystem which allows mapping of arbitrary directories"
Understanding "create a virtual filesystem which allows mapping of arbitrary directories" for FTP server project
免责声明:这是作业;我不想要解决方案
此外,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 我接着向我的讲师提出了这个问题: 得到以下回复: 这些映射只是示例设置。你的解决方案应该能够以类似的方式映射任何东西到任何东西 根据我目前的理解,我只需要允许我的FTP服务器的用户访问显式映射的目录和文件(通过配置文件指定)。这可能意味着像 另外,我需要使用哪个API来支持FTP命令,如/home/user1 -> /mnt/x/home/user1
、/www -> /var/cache/www
和/var/cache/www/home/user_list.txt -> /var/ftpclient/user_list.txt
是唯一需要支持的目录映射吗(因此每个用户将有2个目录和1个文件,如图所示自动为他们创建)?/home -> /home/users
这样的映射(这样所有用户都会看到他们在ftp的伪根目录中,例如用户Bob看到/home/bob/
)。ls
, cd
等,这些命令与真正的底层文件系统一起工作?
您正在创建自己的FTP服务器(或至少其中的一部分)。它需要解决/home/bob
转换为/home/users/bob
的问题。我相信您要这样做的方式是,如果有人输入cd /home/bob
,您只需将传入的file-location转换为一个函数,该函数将用户提供的部分(在本例中为/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
出现。我目前的想法是后者更简单,但我还没有完全解决这个问题。
可能有几个你可以遵循的解决方案,但是"match start of string"和在绝对路径下工作是可行的,除非你想做非常复杂的事情,并且允许你不需要用户做非常复杂的事情,例如,如果我们有这样的映射:
/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)
那么你需要真正理解你在哪里,并翻译修复…/…Into/again。[当然,使用cd /home/bob
然后cd ..
和cd www
可能会产生类似的问题]。
我想澄清一下你的讲师是否真的要求这样做。
如果不需要,则匹配以/
开头的任何内容(其他内容只需传递到chdir
而不更改)
最后一个问题是最简单的:使用Boost Filesystem库,它有你需要的类型,比如文件路径。
对于第一个问题,思路是GET /home/user_list.txt
返回/var/ftpclient/user_list.txt
的内容。这意味着您首先需要将虚拟名称翻译为真实名称(这里可能有些花哨,但基本上您希望检查翻译表中是否出现了虚拟名称的前缀)。花哨包括处理找不到名字的情况)。其次,使用实际名称打开该文件,读取其内容,并将其返回给客户机。
- 如何使用 QProcess 中的 bash 命令'which'
- 为什么编译器说"Static_cast from to which are not related"?
- 使用 -g 选项编译,但"Single stepping until exit from function main, which has no line number information"
- C++:离奇发生的"Request for member X of Y which is of non-class type Z"
- 如何在 boost::variant 中获取特定类型的“.which()”
- 如何理解"C++ allows sizeof(char*) != sizeof(int*)"?
- "A uses B, which is being defined"是什么意思?
- 链表函数 C++ "which is of non-class type 'int'" ?
- tbb::cache_aligned_allocator:与__m128i一起"request for member...which is of non-class type"。用户错误或错误?
- 了解 FTP 服务器项目的"create a virtual filesystem which allows mapping of arbitrary directories"
- 如何调试提升元组错误"no operator found which takes a left-hand operand of type"
- R数据帧与c++中的which.min()等价
- "error: request for member ‘size’ in ‘a’, which is of pointer type"但我不认为这是一个指针
- decltype - "the only context in which a variable defined as a reference is not treated as a synonym
- 当比较short和long时,which被强制转换为which
- 变换算法提供"binary '=' no operator which takes left-hand operand.."