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;

解决方案 »

  1.   

    UnmapViewOfFile(pBuf);
    Result := True;    //加上这句...............
    end;
      

  2.   

    这个程序有BUG啊
    第一次执行MoveLast10ToFirst('E:\dd.txt'); 程序无问题
    不关闭程序,恢复E盘的dd.txt文件里的内容,再执行一次MoveLast10ToFirst('E:\dd.txt'); 程序运行结果就不对了
      

  3.   

    恢复之后,是否保存?再执行一次之后,是否重新打开或者刷新?更正一处错误, CreateFile里的 OPEN_ALWAYS 改成OPEN_EXISTING
    .....