社区
网络编程
帖子详情
文件的分段传输
passenger728
2008-06-01 12:22:21
我做了一个关于文件传输的程序,但是只能传送几十兆以内的小型文件,我想通过文件分段传输实现大型文件的传输,希望大家帮帮忙!先谢了。
...全文
454
15
打赏
收藏
文件的分段传输
我做了一个关于文件传输的程序,但是只能传送几十兆以内的小型文件,我想通过文件分段传输实现大型文件的传输,希望大家帮帮忙!先谢了。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
clakcenter
2011-11-03
打赏
举报
回复
能把你这段分块传输的代码贴出来吗?我现在就是遇到这个问题了请指教
passenger728
2008-06-10
打赏
举报
回复
问题自己解决了,还是感谢各位的指点。
na_he
2008-06-04
打赏
举报
回复
看看思路了,呵呵!
NGCMDHEADER header;
status stsCode = statusOk;
FILE* fp = NULL;
// Open file
fp = fopen(strFileName.c_str(), "rb");
if (fp == NULL)
{
return statusCreateFileError;
}
//
char szDataBuf[MAX_DATABUF_LEN];
size_t dwItem = 0;
//
header.dwCmd = CMD_FDDATA;
// Send file data
while (true)
{
dwItem = fread(szDataBuf, sizeof(char), MAX_DATABUF_LEN, fp);
header.dwBufLen = dwItem;
stsCode = socket.SendExact((char*)&header, sizeof(header));
if (stsCode != statusOk)
{
break;
}
stsCode = socket.SendExact(szDataBuf, dwItem);
if (stsCode != statusOk)
{
break;
}
if (dwItem < MAX_DATABUF_LEN)
{
header.dwCmd = CMD_FDEND;
header.dwBufLen = 0;
stsCode = socket.SendExact((char*)&header, sizeof(header));
LogFileTransferInfo(LOG_FILE, strFileName, ts.nCurFileTransferedSize);
break;
}
// update information
ts.nCurFileTransferedSize += header.dwBufLen;
SendMessage(GetMsgProcHwnd(), WM_TASK_STATUS_UPDATE, STATUS_UPDATE_FILE, (LPARAM)&ts);
}
// Close file & socket
fclose(fp);
char Ext[6];
char szFileName[MAX_PATH];
strcpy(szFileName,strFileName.c_str());
_GetFileExtName(szFileName,Ext);
if( strcmp(Ext,".NSOFT") ==0 )
{
::DeleteFile(szFileName);
}
return stsCode;
}
rageliu
2008-06-04
打赏
举报
回复
file.open(filename,ios::binary); 确定路径正确,除了2进制,带必要的读写参数
9527他大爷
2008-06-03
打赏
举报
回复
一小块一小块从文件读,再发送出去再读
逃逃VS海
2008-06-03
打赏
举报
回复
up 学习用
passenger728
2008-06-03
打赏
举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
我在做文件操作时一般都是用API的,不过CFile应该也没问题,你是open的时候返回false吗?
[/Quote]
文件open的时候没有返回false,只是卡住不动了。
passenger728
2008-06-03
打赏
举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
我在做文件操作时一般都是用API的,不过CFile应该也没问题,你是open的时候返回false吗?
[/Quote]
打开的时候没有显示失败,只是卡住不动了。
僵哥
2008-06-02
打赏
举报
回复
为什么不用API?
cnzdgs
2008-06-02
打赏
举报
回复
我在做文件操作时一般都是用API的,不过CFile应该也没问题,你是open的时候返回false吗?
僵哥
2008-06-02
打赏
举报
回复
API可以查MSDN
CreateFile打开文件
SetFilePointer(相当于seekoff)
ReadFile读文件
CloseHandle关闭文件句柄。
passenger728
2008-06-02
打赏
举报
回复
[Quote=引用 4 楼 unsigned 的回复:]
为什么不用API?
[/Quote]
你能帮我改一改吗,或用API帮我写一个,谢谢 。
僵哥
2008-06-01
打赏
举报
回复
找出“只能传送几十兆以内”的原因。
分包,其实就是一次从文件当中读一块(由于网络的速度是有限的,所以没有任何必要把整个文件几十几百兆一次性读入内存,这个内存消耗是非必要的),然后发送,再读一块。一般只要保留文件的句柄就不需要作任何动作,直接readfile就可以(读文件的时候也不可能是你想读多少就一定能给你读取出来的,而是通过返回值告诉你读取了多少,此时你可能需要继续读取,而你也可以先把读完的发送了,再继续读取。
另外文件也可以通过seek或者SetFilePointer设置文件指针,于是你就可以在任意时间里进行选择性地发送某一段或某几段。
passenger728
2008-06-01
打赏
举报
回复
我对文件分段了,代码如下,在程序运行的时候只能打开4096k以下的文件(我把文件分成4096一块)。
length=strlen(sFname); //获取文件名长度
//发送文件名长度
sendmessage(csock,(const char*)&length,sizeof(int));
//发送文件名
sendmessage(csock,sFname,length);
file.open(filename,ios::binary); //用二进制打开文件
if(file.fail())
{
MessageBox("文件打开失败!");
goto EXIT;
}
fb=file.rdbuf();
length=fb->seekoff(0,ios::end,ios::in)-fb->seekoff(0,ios::beg,ios::in);
fb->seekoff(0,ios::beg,ios::in); //获取文件长度
//发送文件大小
sendmessage(csock,(const char*)&length,sizeof(int));
bRet=TRUE;
char data[4097];
while(length>0)
{
int len=0;
if(length <= 4096)
{
len = length;
}
else
{
len = 4096;
}
//准备缓冲区
// data=new char[len];
file.read(data,len);
// data[length] = '\0';
//发送整个文件
bRet=sendmessage(csock, data, len);
length -= len;
// delete[] data;
}
file.close();
if(bRet){
// MessageBox("发送成功!");
}
else{
MessageBox("发送失败!");
}
希望大家不吝指教。谢谢!
cnzdgs
2008-06-01
打赏
举报
回复
简单点的方式,用TCP协议建立连接,打开文件,做一个循环,每次读一小段数据,发送出去,再循环。
android大
文件
分段
上传
android上利用socket流
分段
上传大
文件
C#socket 大
文件
传输
分段
传输
C#DEMO
C#socket 大
文件
传输
分段
传输
C#DEMO
前端
分段
传输
大
文件
组件,基于HTML5 File API、Blob,后端采用node接收
文件
.zip
html5开发
WCF 实现
文件
分段
上传、支持多个
文件
一起处理、Log4Net日志记录
WCF 实现
文件
分段
上传、支持多个
文件
一起处理、Log4Net日志记录
WCF大
文件
分段
上传下载winform
WCF大
文件
上传下载,有客户端和服务器端,服务器为服务。没有整理的demo,可以使用。
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章