C++ http fileserver 开发手记

来源:互联网 发布:av淘宝改版了怎么回事 编辑:程序博客网 时间:2024/05/29 10:23

目录:https://github.com/archimekai/filesever05/


1         连接约定

规定使用localhost:8080/files/[path]来访问目录和文件。

其中path中的第一个字母为驱动器号(无冒号)

使用fileinfo类来记载文件的有关信息,目前只需要记载文件名,以及是文件还是文件夹。

2         关于字符的问题

很头痛的一个问题是如何处理中文。

为了统一对ANSI字符和Unicode字符的处理,可以使用TCHAR这一类型,其根据编译时是否定义了_UNICODE和_MBCS来决定使用何种字符串处理函数。(细节可以参考http://blog.sina.com.cn/s/blog_826f6b5c0100yljn.html)

ANSI中,一个字符占一个字节,而在Unicode中,一个字符占有两个字节,从而可以更好地支持其他语言。

在程序内部统一使用Unicode(为什么不用utf-8?)

 

为了能够同时支持Unicode和MBCS,定义tstring如下(细节见http://blog.csdn.net/kamaliang/article/details/3981193):

        #ifdef _UNICODE

        #define tstring wstring

        #else

        #define tstring string

        #endif

 

此外,程序还涉及到了从tstring到tchar*的转换,我使用的方法如下(另参见:http://blog.csdn.net/pizi0475/article/details/5346708):


 

       LPTSTR pgoalpath = newTCHAR[goalpath.length() + 1];       int i = 0;       for (int i = 0; i < goalpath.length(); ++i) {              pgoalpath[i] = goalpath[i];       }       pgoalpath[i] = 0;

 

3         关于文件的显示方式

 

显示示例:(目前仅实现了文件名的显示)

..  上一级

文件名                    修改日期                          大小

使用

 

为了显示出所有的驱动器,上网查了一些方法,MSDN中有Displaying Volume Paths(显示 卷 的路径)一文,不过较为复杂,其实可以遍历26个字母,判断它们是否为驱动器号(详情:http://zhidao.baidu.com/link?url=SaqYXz8FAmdCDBspRmKoqMTEp8IbhjPV3U7HKD6v85WNo_PLJM7JKuynmEAuXWsUMtTn7y3O6Gy3M2X0qA1h57n5opxfSH0RqUj_FN2oweG)。

 

3.1  关于uri中含有空格的问题

又开始造轮子了。。。

自己定义了空格转换为%20 也即两者之前的互相转换。

为此,写了tstring _treplace (tstring str, tstring goalstr, tstring sourcestr)

3.2  关于URL中含有中文的问题

貌似C++中并没有对应的现成函数。

自行编写了两者之间的转换函数

// replace all uft8 %dd%dd tochinese charactors

tstring _tdecode2zhcn(tstring str) {       tstringresult;       for (auto it = str.begin(); it != str.end(); ++it) {              unsigned char ctemp[URL_BUFLEN] = { 0 };              int i = 0;              while (it != str.end() && (*it) == '%' ) {                     // if always % started utf 8                     ctemp[i] = hex2char(*(it + 1), *(it + 2));                     it =it + 3;                     ++i;              }              if (i > 0) {                     tstring wstr;                     char2tstring((char *)ctemp, wstr);                     result.append(wstr);              }              if (it != str.end()) {                     result.append(1, (*it));              }              if (it == str.end()) {  // it may become it.end()                     break;              }       }       return result;}


 

3.3  关于以.. 或者 . 结尾的url

貌似浏览器会自动转化为相应的目录,并且会加上/  所以要将自动加上的这个/ 去掉

4         关于网页文件的发送

为了使得网页能够应用send发送过去,需要将string(wchar)填充到char类型的buffer中。

4.1  浏览器如何得知文件名

应该是通过URL得知,事实也验证了我的这一想法。



0 0