ULONGLONG类型的使用,适合存储文件的大小(4G以上的)

mfc里面的CFile文件获取到文件的大小,使用的是:file.GetLength(),返回的类型为ULONGLONG,这个对于大于4G的文件来说,才是足够的.

我原以为用一个long型就可以保存下这个大小,结果错的离谱.

 

long型在win32平台下,就是32位的,跟int其实就是一回事.唉,害苦我了,不知道为什么一直以为long是64的.

 

所以vc里面写64位的int都是这样定义的  _int64 

 

但是一般使用的时候,类型清楚就直接使用ULONGLONG这样的自定义就很好用了.

 

要printf出这样的类型,是不能用%d来表示的,论坛上竟然还有人误解大家.

 

要这样写:

ULONGLONG filetotalsize=5912341234;

printf("size=%I64u",filetotalsize);

 

否则出来的结果只会是%d代表的最大值.

 

将字符串转换为ULONGLONG类型,是使用

char strbuff[32]="4812341234";

ULONGLONG tt=_atoi64(strbuff);

这样的代码.

 

有的地方说用atoll,但是没有这个函数啊,说要什么gg标准,我是不清楚了.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MFC框架下的HTTP上传文件大小受限于HTTP协议和操作系统的限制,一般最大只能上传2G左右的文件。如果要上传超过4G文件,可以使用分片上传的方式,将大文件分成多个小文件,分别上传并合并。以下是一个简单的示例代码,仅供参考: ``` void CMyHttpDlg::OnUpload() { CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All Files (*.*)|*.*||"), NULL); if (dlg.DoModal() == IDOK) { CString strFilePath = dlg.GetPathName(); CString strFileName = dlg.GetFileName(); CString strBoundary = _T("----MyBoundary"); CString strHeader; strHeader.Format(_T("Content-Type: multipart/form-data; boundary=%s"), strBoundary); CString strData; strData.Format(_T("--%s\r\nContent-Disposition: form-data; name=\"file\"; filename=\"%s\"\r\nContent-Type: application/octet-stream\r\n\r\n"), strBoundary, strFileName); CFile file(strFilePath, CFile::modeRead | CFile::shareDenyNone); ULONGLONG dwFileSize = file.GetLength(); ULONGLONG dwBytesSent = 0; DWORD dwChunkSize = 1024 * 1024; // 每次上传1MB数据 char *pChunkData = new char[dwChunkSize]; DWORD dwBytesRead = 0; CInternetSession session; CHttpConnection *pConnection = session.GetHttpConnection(_T("www.example.com"), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL); CString strFormData = strData; while (dwBytesSent < dwFileSize) { DWORD dwBytesToRead = min(dwChunkSize, dwFileSize - dwBytesSent); file.Read(pChunkData, dwBytesToRead); strFormData.Append(pChunkData, dwBytesToRead); dwBytesSent += dwBytesToRead; if (dwBytesSent == dwFileSize) { strFormData.AppendFormat(_T("\r\n--%s--\r\n"), strBoundary); } else { strFormData.AppendFormat(_T("\r\n--%s\r\nContent-Disposition: form-data; name=\"file\"; filename=\"%s\"\r\nContent-Type: application/octet-stream\r\n\r\n"), strBoundary, strFileName); } if (dwBytesSent % dwChunkSize == 0 || dwBytesSent == dwFileSize) { CHttpFile *pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, _T("upload.php"), NULL, 1, NULL, NULL, INTERNET_FLAG_RELOAD); pFile->AddRequestHeaders(strHeader); pFile->SendRequest(strFormData, strFormData.GetLength()); char szResponse[1024]; while (pFile->Read(szResponse, 1024) > 0) { // 处理服务器响应 } pFile->Close(); delete pFile; strFormData = strData; } } file.Close(); delete[] pChunkData; pConnection->Close(); delete pConnection; } } ``` 需要注意的是,上传超过4G文件可能需要很长时间,需要在客户端和服务器端都进行相关设置来避免连接超时等问题。此外,为了保证上传的数据完整性,还需要在服务器端进行数据校验和错误处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值