请教大家文件流编程
我现在作一个给服务器上传文件流和下载的程序,我对文件流不太了解,想问一下大家。
另外,怎么读取文件流,怎么存储它,都用什么函数?有这方面的资料也可以,谢谢大家
问题点数:100、回复次数:9Top
1 楼Atomictry(天影)回复于 2006-03-07 10:34:58 得分 5
可以通过ftp、tcp/ip来传。Top
2 楼youyingbo()回复于 2006-03-07 10:39:20 得分 0
这个我知道,我可以用socket传输一些字符串,但不知道文件流是怎么回事,用什么方式传输Top
3 楼youyingbo()回复于 2006-03-07 14:46:44 得分 0
顶下,100分啊,没人知道吗
我用函数fread(void *ptr, size_t size, size_t nmemb, FILE* stream)来读一个字符文件,其中size是读多少,但我不知道一个字符文件有多少字符,如果我想把这个文件完整的读下来,该怎么办?
不可能设一个很大的值读取吧?
Top
4 楼sunj_study()回复于 2006-03-07 15:24:00 得分 5
先获取整个文件的大小nLength。size随便定义多大,把每次读到的长度累加起来total,当nLength-total < size时,再读一次就读完文件了。Top
5 楼arrow8209(arrow)回复于 2006-03-07 15:24:08 得分 5
我以前写过现在忘了。你可以到网络上找找,好像有这方面的代码Top
6 楼modena(非云)回复于 2006-03-07 15:34:37 得分 43
首先明确流的概念,我的接触中遇到两种流:媒体流和字节流
媒体流侧重于带有时间节的采样报文
字节流侧重于相同时间内有相同大小的数据,在网络上被处理成流量控制
现在来看文件,文件的读写操作简单,打开文件的句柄后指定长度读,大文件获取文件总长度后分块读,小文件一次性读入内存
最后,我们来说文件流的实现.
牵涉到流,那么不可避免的需要处理缓冲区,以多线程控制良好的缓冲机制,处理好客户/服务两端的时间差/请求与休整/同步处理/流控处理,才能够真正的实现所谓的流式传输
正常的做法是读数据在缓冲区有空位时抛入缓冲区,线程读取缓冲区数据Top
7 楼modena(非云)回复于 2006-03-07 15:37:33 得分 0
向网络上发送,客户端接收数据后写入文件
如果不需要考虑多个文件同时下载,可以不考虑流控和数据报文分片Top
8 楼xx_jj()回复于 2006-03-07 16:09:47 得分 42
给你点代码
//发送文件线程
UINT _SendFileThread(LPVOID lparam)
{
CMyQQDlg *pDlg=(CMyQQDlg *)lparam;
if(pDlg->StopServer==true) return -1;
CSocket sockClient;
sockClient.Create();
CString ip;
pDlg->m_You_IP.GetWindowText(ip);
sockClient.Connect(ip, PORT+pDlg->m_client);
//首先发送标记F为文件,2
int end=0;
end=sockClient.Send("F",FLAG);
///////////////////////////////////////////////////////////////////发送标志是否成功
if(end==SOCKET_ERROR)
{
AfxMessageBox("_SendFileThread Send错误!"+pDlg->GetError(GetLastError()));
return -1;
}
else if(end!=2)
{
AfxMessageBox("文件头错误");
return -1;
}
///////////////////////////////////////////////////////////////////
CFile myFile;
FILEINFO myFileInfo;
if(!myFile.Open(pDlg->m_fileName, CFile::modeRead | CFile::typeBinary))
return -1;
myFileInfo.fileLength=myFile.GetLength(); //得到文件大小
strcpy(myFileInfo.fileName,myFile.GetFileName());//得到文件名称
sockClient.Send(&myFileInfo,sizeof(myFileInfo)); //发送文件信息
pDlg->m_Progress.SetRange32(0,myFileInfo.fileLength);
myFile.Seek(0,CFile::begin);
char m_buf[SIZEFILE]={0};
CString strError;
int num=0;
end=0;
int temp=0;
pDlg->GetDlgItem(IDC_BUTTON_STOP_FILE)->EnableWindow(true);
for(;;)
{
if(pDlg->FileWork==false)
{
pDlg->FileWork=true;
pDlg->GetDlgItem(IDCANCEL)->EnableWindow(false);
pDlg->GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(false);
}
num=myFile.Read(m_buf, SIZEFILE);
if(num==0) break;
end=sockClient.Send(m_buf, num);
temp+=end;
pDlg->m_Progress.SetPos(temp);
if(pDlg->FileStop==true)
{
pDlg->FileStop=false;
pDlg->FileWork=false;
break;
}
if(end==SOCKET_ERROR)
{
AfxMessageBox("_SendFileThread Send错误!"+pDlg->GetError(GetLastError()));
break;
}
}
pDlg->m_Progress.SetPos(0);
CString strLocalName;
pDlg->GetLocalHostName(strLocalName);
CString strLocalIP;
pDlg->GetIpAddress(strLocalName,strLocalIP);
if(temp==myFileInfo.fileLength)
pDlg->AddMsgList(strLocalIP+"->"+strLocalName,"文件发送成功");
else
pDlg->AddMsgList(strLocalIP+"->"+strLocalName,"文件发送失败");
myFile.Close();
sockClient.Close();
pDlg->FileWork=false;
pDlg->GetDlgItem(IDC_PROGRESS_SEND_FILE)->ShowWindow(SW_HIDE);
pDlg->GetDlgItem(IDC_BUTTON_STOP_FILE)->EnableWindow(false);
pDlg->GetDlgItem(IDCANCEL)->EnableWindow(true);
pDlg->GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(true);
return 0;
}Top
9 楼youyingbo()回复于 2006-03-08 13:05:36 得分 0
载顶下看看Top




