For 32位程序
function MoveLast10ToFirst(Const sFile : String) : Boolean;
var
hFile , hMap : THandle;
dwSize , dwHigh : DWORD;
pBuf : Pointer;
Buf : array [0..9] of Byte;
begin
Result := False;
hFile := CreateFile(PChar(sFile) , GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL , 0);
if hFile=INVALID_HANDLE_VALUE then exit;
dwSize := GetFileSize(hFile , @dwHigh);
if (dwSize < 10) or (dwHigh<>0) then begin //文件小于10或者大于4G,暂时放弃
CloseHandle(hFile);
exit;
end;
hMap := CreateFileMapping(hFile , NIL , PAGE_READWRITE , 0 , dwSize , NIL);
if hMap=0 then begin
CloseHandle(hFile);
exit;
end;
pBuf := MapViewOfFile(hMap , FILE_MAP_READ or FILE_MAP_WRITE , 0 , 0 , 0);
if pBuf<>NIL then begin
//将最后10字节保存到临时Buf中
Move(Pointer(DWORD(pBuf) + dwSize - SizeOf(Buf))^ , Buf , SizeOf(Buf));
//将整个文件内容往后移10字节
Move(pBuf^ , Pointer(DWORD(pBuf) + SizeOf(Buf))^ , dwSize - SizeOf(Buf));
//将临时Buf中的10字节写入文件头
Move(Buf , pBuf^ , SizeOf(Buf));
//释放资源
UnmapViewOfFile(pBuf);
end;
CloseHandle(hMap);
CloseHandle(hFile);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
MoveLast10ToFirst('E:\dd.txt');
end;
function MoveLast10ToFirst(Const sFile : String) : Boolean;
var
hFile , hMap : THandle;
dwSize , dwHigh : DWORD;
pBuf : Pointer;
Buf : array [0..9] of Byte;
begin
Result := False;
hFile := CreateFile(PChar(sFile) , GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL , 0);
if hFile=INVALID_HANDLE_VALUE then exit;
dwSize := GetFileSize(hFile , @dwHigh);
if (dwSize < 10) or (dwHigh<>0) then begin //文件小于10或者大于4G,暂时放弃
CloseHandle(hFile);
exit;
end;
hMap := CreateFileMapping(hFile , NIL , PAGE_READWRITE , 0 , dwSize , NIL);
if hMap=0 then begin
CloseHandle(hFile);
exit;
end;
pBuf := MapViewOfFile(hMap , FILE_MAP_READ or FILE_MAP_WRITE , 0 , 0 , 0);
if pBuf<>NIL then begin
//将最后10字节保存到临时Buf中
Move(Pointer(DWORD(pBuf) + dwSize - SizeOf(Buf))^ , Buf , SizeOf(Buf));
//将整个文件内容往后移10字节
Move(pBuf^ , Pointer(DWORD(pBuf) + SizeOf(Buf))^ , dwSize - SizeOf(Buf));
//将临时Buf中的10字节写入文件头
Move(Buf , pBuf^ , SizeOf(Buf));
//释放资源
UnmapViewOfFile(pBuf);
end;
CloseHandle(hMap);
CloseHandle(hFile);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
MoveLast10ToFirst('E:\dd.txt');
end;
Result := True; //加上这句...............
end;
第一次执行MoveLast10ToFirst('E:\dd.txt'); 程序无问题
不关闭程序,恢复E盘的dd.txt文件里的内容,再执行一次MoveLast10ToFirst('E:\dd.txt'); 程序运行结果就不对了
.....