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得知,事实也验证了我的这一想法。
- C++ http fileserver 开发手记
- golang http.FileServer 遇到的坑
- GO1.5标准包http.FileServer的拔高用法.
- C语言实现FFT算法 - 开发手记
- golang中的http.FileServer通常要跟http.StripPrefix结合使用
- Golang1.8标准库http.Fileserver跟http.ServerFile小例子
- 开发手记
- HTTP协议手记
- Android 开发手记二 C可执行程序编译实例
- Android 开发手记一 ndk + C应用程序 (转)
- Android 开发手记二 C可执行程序编译实例
- Android 开发手记二 C可执行程序编译实例
- [c#]喜马拉雅FM音频批量下载器开发手记
- AppNinja 开发手记3: 安装 ipa 的本地 http 服务器 plist
- 6220c试用手记..
- C语言复习手记
- MySpy开发手记
- CSR蓝牙开发手记
- 逆向思维《专利法》,开拓创新“三步法”
- request,yield爬取网页
- 一个App的界面设计流程是怎么产生的
- 解决PHP Mysql 插入中文显示问号
- Android实战 - 音心播放器 (MusicActivity - 倒计时 ,进度条实现)
- C++ http fileserver 开发手记
- Java开源报表JasperReport、iReport4.5.1使用详解(一)
- Java获得硬盘和主板的序列号代码
- Android之微信支付功能
- android开发的学习路线
- Android内存优化杂谈
- 编程的价值
- oracle内置函数 NVL (expr1, expr2),NVL2 (expr1, expr2, expr3)
- Android布局属性详解