目录: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得知,事实也验证了我的这一想法。