`
cfree
  • 浏览: 17893 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

SetFilePointer

 
阅读更多

下面是SetFilePointer函数的声明
DWORD SetFilePointer(HANDLE hFile,Long IDistanceToMove,
                     PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod);


lpDistanceToMoveHigh 参数是用来管理大文件,如果要移到文件中任何位置,我们就必须设置这个参数的值。假如我们传入NULL值,那么lDistanceToMove 的最大值是2^31–2(2G-2),因为所有文件指针的值是有符号的。因此,就算文件只有很少的机会能够达到这个大小,我们最好还是把文件当成是一个大文件,并且在程序中使用64位的指针(就是lpDistanceToMoveHigh的值不是NULL)。如果我们有一个压缩的并且文件很少的NTFS文件系统中,即使当前盘的空间不是很大的情况下,也很可能会有一些大文件。

假如lpDistanceToMoveHigh传入的不是NULL,那么lpDistanceToMoveHigh和lDistanceToMove会组成一个有符号的64位值。lDistanceToMove参数是被作为这个值的低32们,lpDistanceToMoveHigh作为高32位,也就是说lpDistanceToMoveHigh是lDistanceToMove的符号扩展名。

为了从0移动到2G位置,lpDistanceToMoveHigh必须设置为NULL或当作lDistanceToMove的符号扩展名。为了移动到大于2G的位置,就要使用lpDistanceToMoveHigh和lDistanceToMove合成一个有符号的64位值。举个例子:为了从2G位置移到4G的位置,我们需要设置lpDistanceToMoveHigh的值为0或-1,让它作为lDistanceToMove的符号扩展名

为了支持64位文件指针,你可以传一个LONG,把它当作64位文件指针的高位,并把它传给lpDistanceToMoveHigh。这就意味着你必须把两个不同的变量当作一个操作单元,要不然这可能会出错。最好还是使用LARGE_INTEGER结构来创建一个64位值,并且把其中两个union元素作为参数传入

当然,最好还是写一个函数来替代SetFilePointer。下面是一个代码例子,用来演示你想要的功能

__int64 myFileSeek(HANDLE hf,__int64 distance,DWORD MoveMethod)
{
   LARGE_INTEGER li;
   li.QuadPart = distance;
   li.LowPART = SetFilePointer(hf,li.lowPart,&li.HighPart,MoveMethod);
   if(li.LowPart == INVALID_SET_FILE_POINTER && GetLastError()!      =NO_ERROR)
   {
     li.QuadPart = -1;
   }
   return li.QuadPart;
}

分享到:
评论

相关推荐

    快速掌握Mysql数据库对文件操作的封装

    Mysql对文件的操作中,它在不同的操作系统上对文件的操作,除了使用标准C运行库函数,包括open、close、seek等,在Win32下的文件和目录操作函数使用了CreatFile、CloseHandl、SetFilePointer等。其实使用API和标准...

    WinAPI (Delphi版)

    SetFilePointer SetFileTime SystemTimeToFileTime UnlockFile UnMapViewOfFile VerQueryValue WriteFile Strings and Atoms AddAtom CharLower CharLowerBuff CharNext CharPrev ...

    易语言MBR读写

    SetFilePointer (device, 0, 0, 0) statue = ReadFile (device, Mbrbase, #MBE结构长度, count, 安全结构) CloseHandle (device) 返回 (statue) .子程序 取整型指针, 整数型, 公开, 返回一个整数型变量的...

    VB6超大文件(大于2G)读写 示例代码

    VB6超大文件读写,使用SetFilePointer定位,分段读写,解决VB6超大文件复制问题

    API之网络函数---整理网络函数及功能

    SetFilePointer 在一个文件中设置当前的读写位置 SetFileTime 设置文件的创建、访问及上次修改时间 SetHandleCount 这个函数不必在win32下使用;即使使用,也不会有任何效果 SetVolumeLabel 设置一个磁盘的卷标...

    易语言快速创建文件

    易语言快速创建文件源码,快速创建文件,创建空白文件,CreateFile,printf,CreateFileMapping,CloseHandle,SetFilePointer,SetEndOfFile

    易语言写软盘引导区

    易语言写软盘引导区源码,写软盘引导区,写入A盘引导区,CreateFileA,关闭内核对象_,SetFilePointer,WriteFile,ReadFile

    易语言修改连接限制

    易语言修改连接限制源码,修改连接限制,GetSystemDirectory,GetFileVersionInfo,GetFileVersionInfoSize,VerQueryValue,CopyMemory,GetWindowsDirectory,CreateFile,WriteFile,SetFilePointer,CloseHandle,...

    易语言启动计算机简单

    易语言启动计算机简单源码,启动计算机简单,写扇区,启动代码,CreateFileA,SetFilePointer,ReadFileD,CloseHandle,取整数指针,WriteFileD,取字节集指针

    易语言API写到文件运行创建文件

    易语言API写到文件运行创建文件源码,运行_,创建文件_,写到文件_,CloseHandle,取整数指针,CreateFile,SetFilePointer,WriteFileD,WinExec

    易语言制作启动盘

    易语言制作启动盘源码,制作启动盘,生成扇区启动文件数据,写扇区,CreateFileA,SetFilePointer,ReadFileD,CloseHandle,取整数指针,WriteFileD,取字节集指针

    易语言扇区读写

    易语言扇区读写源码,扇区读写,取物理磁盘个数,读扇区,写扇区,WriteFile,CreateFile,SetFilePointer,ReadFileD,CloseHandle,取整数指针,拷贝内存_

    易语言大文件处理

    易语言大文件处理源码,大文件处理,打开对象,关闭对象,取对象长度,移动对象位置,取对象位置,读入对象,CreateFile,CloseHandle,SetFilePointer,SetLastError,ReadFile,GetFileSizeEx

    TXT文件合并程序源代码

    该程序实现TXT文件合并. 程序内运用Win32 API(CreateFile、SetFilePointer、ReadFile、WriteFile、CloseHandle)实现文件操作. 欢迎各位对该代码参考与点评,请多多指教.

    易语言mbr查看

    易语言mbr查看源码,mbr查看,读扇区,写扇区,字节集到十六进制,字节集到十进制,字节集到文本,完善数据,GetByteAddress,CreateFile,SetFilePointer,ReadFile,CloseHandle,Mbr,Bbr,WriteFile

    易语言插节感染

    插节感染,GetDword,GetWord,SetDword,SetWord,GetbyteAddress,GetTextAddress,CopyMemory,ZeroMemory,Initialize,Close,Infect,PEAlign,CreateFile,CloseHandle,GetFileSize,WriteFile,ReadFile,SetFilePointer,...

    易语言MBR引导扇区解析

    易语言MBR引导扇区解析源码,MBR引导扇区解析,十六进制到字节集,到十六进制,字节集到十六进制,读取MBR,取整型指针,到十进制,写入MBR,WriteFile,ReadFile,CreateFile,SetFilePointer,取整型指针_,CloseHandle,StrToInt...

    c语言程序设计文件操作方法示例(CreateFile和fopen)

    c主要的文件操作函数有:CreateFile,CloseHandle,ReadFile,WriteFile,SetFilePointer,GetFileSize。其中的读写操作是以字符为单位,获得文件大小也是以字符为单位。

Global site tag (gtag.js) - Google Analytics