更新时间:2016-06-20 20:30:35浏览次数:1+次
HANDLE hFile = CreateFile(L"D:/科洛弗道10号.rmvb", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE ,NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)return;
LARGE_INTEGER FileSize,HandleFileSize,LeftFileSize;
HandleFileSize.QuadPart=0;
if(!GetFileSizeEx(hFile,&FileSize))
{
MessageBox(NULL,L"获取文件大小出错",L"出错",0);
return;
}
LeftFileSize.QuadPart = FileSize.QuadPart;
DWORD dwBufSize = 1024*1024*100;//100MB
char * pBuf = new char[dwBufSize];
DWORD dwRead;//实际读出的数量
DWORD dwWritten;//实际写入的数量
while(HandleFileSize.QuadPart<FileSize.QuadPart)
{
if (LeftFileSize.QuadPart>=dwBufSize)
{
//剩余文件大小大于缓存的大小
ReadFile(hFile,pBuf,dwBufSize,&dwRead,NULL);
if (dwRead<dwBufSize)
{
//只读取了一部分数据
//倒回去重新读取
SetFilePointer(hFile,dwRead*(-1),NULL,FILE_CURRENT);
continue;
}
else
{
//读完了本次的所有的数据,指针自动向后移动了
HandleFile(hFile,pBuf,dwRead,dwWritten);
HandleFileSize.QuadPart+=dwRead;
LeftFileSize.QuadPart-=dwRead;
}
}
else
{
//剩余文件大小不足缓存大小
ReadFile(hFile,pBuf,LeftFileSize.QuadPart,&dwRead,NULL);
if (dwRead<LeftFileSize.QuadPart)
{
//只读取了一部分数据
//倒回去重新读取
SetFilePointer(hFile,dwRead*(-1),NULL,FILE_CURRENT);
continue;
}
else
{
//读完了本次的所有的数据
HandleFile(hFile,pBuf,dwRead,dwWritten);
HandleFileSize.QuadPart+=dwRead;
LeftFileSize.QuadPart-=dwRead;
}
}
}
delete [] pBuf;
CloseHandle(hFile);
void HandleFile(HANDLE& hFile,char* pBuf,DWORD& dwRead,DWORD& dwWritten)
{
//加密处理
for (DWORD i=0;i<dwRead;i++)
{
//加密代码,此处用最简单的加密,注意加密必须能够解密,才能还原文件数据
pBuf[i]++;
}
//指针倒退到本次数据的起始位置
SetFilePointer(hFile,dwRead*(-1),NULL,FILE_CURRENT);
WriteFile(hFile,pBuf,dwRead,&dwWritten,NULL);
//倒回去重新写入文件,直到成功为止
while (dwWritten<dwRead)
{
SetFilePointer(hFile,dwWritten*(-1),NULL,FILE_CURRENT);
WriteFile(hFile,pBuf,dwRead,&dwWritten,NULL);
}
}
#include <Windows.h>
#include <iostream>
using namespace std;
void HandleFile(HANDLE& hFile,char* pBuf,DWORD& dwRead,DWORD& dwWritten)
{
//加密处理
for (DWORD i=0;i<dwRead;i++)
{
//加密代码,此处用最简单的加密,注意加密必须能够解密,才能还原文件数据
pBuf[i]++;
}
//指针倒退到本次数据的起始位置
SetFilePointer(hFile,dwRead*(-1),NULL,FILE_CURRENT);
WriteFile(hFile,pBuf,dwRead,&dwWritten,NULL);
//倒回去重新写入文件,直到成功为止
while (dwWritten<dwRead)
{
SetFilePointer(hFile,dwWritten*(-1),NULL,FILE_CURRENT);
WriteFile(hFile,pBuf,dwRead,&dwWritten,NULL);
}
}
void main()
{
HANDLE hFile = CreateFile(L"D:/科洛弗道10号.rmvb", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE ,NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)return;
LARGE_INTEGER FileSize,HandleFileSize,LeftFileSize;
HandleFileSize.QuadPart=0;
if(!GetFileSizeEx(hFile,&FileSize))
{
MessageBox(NULL,L"获取文件大小出错",L"出错",0);
return;
}
LeftFileSize.QuadPart = FileSize.QuadPart;
DWORD dwBufSize = 1024*1024*100;//100MB
char * pBuf = new char[dwBufSize];
DWORD dwRead;//实际读出的数量
DWORD dwWritten;//实际写入的数量
while(HandleFileSize.QuadPart<FileSize.QuadPart)
{
if (LeftFileSize.QuadPart>=dwBufSize)
{
//剩余文件大小大于缓存的大小
ReadFile(hFile,pBuf,dwBufSize,&dwRead,NULL);
if (dwRead<dwBufSize)
{
//只读取了一部分数据
//倒回去重新读取
SetFilePointer(hFile,dwRead*(-1),NULL,FILE_CURRENT);
continue;
}
else
{
//读完了本次的所有的数据,指针自动向后移动了
HandleFile(hFile,pBuf,dwRead,dwWritten);
HandleFileSize.QuadPart+=dwRead;
LeftFileSize.QuadPart-=dwRead;
}
}
else
{
//剩余文件大小不足缓存大小
ReadFile(hFile,pBuf,LeftFileSize.QuadPart,&dwRead,NULL);
if (dwRead<LeftFileSize.QuadPart)
{
//只读取了一部分数据
//倒回去重新读取
SetFilePointer(hFile,dwRead*(-1),NULL,FILE_CURRENT);
continue;
}
else
{
//读完了本次的所有的数据
HandleFile(hFile,pBuf,dwRead,dwWritten);
HandleFileSize.QuadPart+=dwRead;
LeftFileSize.QuadPart-=dwRead;
}
}
}
delete [] pBuf;
CloseHandle(hFile);
}