test.txt
line1 第一行内容
line2 第二行内容
line3 第三行内容
程序读出 “第一行内容” 之后 删除。
在读取将读出 “第二行内容” 之后 删除。
void CReplaceRowDlg::RemoceRow(int nRow, char* sFile)
{
HANDLE hFile = CreateFile(sFile, GENERIC_WRITE | GENERIC_READ, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
AfxMessageBox( "文件不存在或文件错! ");
return;
}
// Get the size of the file (I assume the whole file can be mapped).
DWORD dwFileSize = GetFileSize(hFile, NULL);
if (dwFileSize <1)return ;
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwFileSize , NULL);
if (hFileMap == NULL)
{
AfxMessageBox( "文件映射错! ");
CloseHandle(hFile);
return ;
}
//long nRowNumber=5;
long nCur=0;
PVOID pvFile=MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0,0 );
char* p=(char*)pvFile;
long nSize=dwFileSize;///用来判断还有多少没有读取,也就是是否到文件尾
while(nCur <nRow-1 && nSize> 0)
{
if( '\n '==*p)nCur++;
p++;
nSize--;
}
DWORD dwRowLen=0;
if(nCur==nRow-1 && nSize> 0)
{
///删除第nRow行
char* pBuf=p;
nCur=0;
while(nCur <1 && nSize> 0)///可能会友空行
{
if( '\n '==*pBuf)nCur++;
pBuf++;
nSize--;
}
char* pp=(char*)pvFile;
if(nSize> 0)///nRow后面还有数据///后面部分的长度
{
dwRowLen=pBuf-p;///该行的长度
DWORD dwItem=64*1024;///以64k为单位的缓存
char * pMyBuf=(char*) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwItem);
while(nSize> 0)
{
nSize-=dwItem;
if(nSize> =0)
{
memcpy(pMyBuf,pBuf,dwItem);
pBuf+=dwItem;
memcpy(p,pMyBuf,dwItem);
p+=dwItem;
}
}
if(nSize <0)
{
nSize+=dwItem;
memcpy(pMyBuf,pBuf,nSize);
memcpy(p,pMyBuf,nSize);
}
HeapFree(GetProcessHeap(),0,pMyBuf);
}
}
UnmapViewOfFile(pvFile);
CloseHandle(hFileMap);
SetFilePointer(hFile,dwFileSize-dwRowLen,NULL,FILE_BEGIN);
SetEndOfFile(hFile);
CloseHandle(hFile);
}