目录:https://github.com/archimekai/filesever05/
规定使用localhost:8080/files/[path]来访问目录和文件。
其中path中的第一个字母为驱动器号(无冒号)
使用fileinfo类来记载文件的有关信息,目前只需要记载文件名,以及是文件还是文件夹。
很头痛的一个问题是如何处理中文。
为了统一对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;
显示示例:(目前仅实现了文件名的显示)
.. 上一级
文件名 修改日期 大小
使用
为了显示出所有的驱动器,上网查了一些方法,MSDN中有Displaying Volume Paths(显示 卷 的路径)一文,不过较为复杂,其实可以遍历26个字母,判断它们是否为驱动器号(详情:http://zhidao.baidu.com/link?url=SaqYXz8FAmdCDBspRmKoqMTEp8IbhjPV3U7HKD6v85WNo_PLJM7JKuynmEAuXWsUMtTn7y3O6Gy3M2X0qA1h57n5opxfSH0RqUj_FN2oweG)。
又开始造轮子了。。。
自己定义了空格转换为%20 也即两者之前的互相转换。
为此,写了tstring _treplace (tstring str, tstring goalstr, tstring sourcestr)
貌似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; }
貌似浏览器会自动转化为相应的目录,并且会加上/ 所以要将自动加上的这个/ 去掉
为了使得网页能够应用send发送过去,需要将string(wchar)填充到char类型的buffer中。
应该是通过URL得知,事实也验证了我的这一想法。