`
cfree
  • 浏览: 18528 次
  • 性别: 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;
}

分享到:
评论

相关推荐

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

    为了解决这个问题,我们可以利用Windows API中的`SetFilePointer`函数来实现大文件的精确定位和分段读写。`SetFilePointer`函数允许我们对文件指针进行任意位置的移动,从而有效地处理大文件。 `SetFilePointer`...

    Windows 下读写磁盘扇区

    我们可以使用 CreateFile 函数来打开磁盘逻辑分区,然后使用 SetFilePointer 函数来把文件指针移到要操作的磁盘扇区开始处。最后,我们可以使用 ReadFile 函数和 WriteFile 函数来读取和写入磁盘扇区的数据。 ...

    用API计算文件大小

    Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, ByRef lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long Declare Function CloseHandle...

    文件操作1

    本文将详细讲解如何在Windows API中使用`CreateFileA`、`CloseHandle`、`ReadFile`、`WriteFile`以及`SetFilePointer`和`GetFileSize`函数来管理和操作文件,并重点探讨与安全相关的参数。 首先,`CreateFileA`函数...

    检查是否是Win32 可执行文件的软件源码

    SetFilePointer(hFile, ByVal lDistanceToMoveAsLong, lpDistanceToMoveHigh, ByVal dwMoveMethodAsLong) As Long ``` 这里的 `dwMoveMethodAsLong` 参数通常设置为 `FILE_BEGIN` 或 `FILE_CURRENT`,分别表示从文件...

    VC编程在Windows下直接读写磁盘扇区数据

    一旦磁盘分区被成功打开,我们还需要使用`SetFilePointer()`函数将文件指针移动到目标扇区的位置。这是因为`CreateFile()`打开的是整个逻辑分区,而我们需要操作的仅仅是其中的部分扇区。接下来,可以通过`ReadFile...

    易语言扇区读写

    读扇区通常使用`CreateFile`函数打开磁盘设备,然后通过`SetFilePointer`设置要读取的扇区位置,最后使用`ReadFile`函数读取指定扇区的数据。在易语言中,这些步骤需要使用相应的易语言语句和函数进行封装。 4. **...

    VisualC面向对象与可视化程序设计解析PPT教案学习.pptx

    这通常涉及到上述文件操作函数的综合运用,例如使用OpenFile对话框获取文件名,然后通过CreateFile打开文件,使用ReadFile读取内容到内存,编辑后使用WriteFile写回文件,最后可能用到SetFilePointer来定位文件指针...

    yy.rar_visual c

    例如,如果我们要修改一个文本文件的某一行,可以先用`CreateFile()`打开文件,再用`SetFilePointer()`定位到目标位置,然后用`WriteFile()`写入新内容。 下面是一个简单的文件追加内容的示例: ```cpp #include ...

    河北工业大学202x操作系统实验报告.pdf

    - **SetFilePointer**: 设置文件指针到指定的位置,用于文件的读写操作。 - **CreateFileMapping**: 创建或打开一个命名或未命名的文件映射对象,用于进程间共享数据。 - **MapViewOfFile**: 将文件映射对象映射到...

    C语言读取引导扇区C语言读取引导扇区

    SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN); ``` ##### 3. 使用`ReadFile`函数读取数据 - **函数原型**: ```c BOOL ReadFile( HANDLE hFile, // 文件句柄 LPVOID lpBuffer, // 缓冲区 ...

    磁盘绝对读取 vc

    在VC++中,可以使用Windows API函数如`CreateFile`、`SetFilePointer`和`ReadFile`来实现磁盘的绝对读取。 1. `CreateFile`函数:这是一个关键的API调用,用于打开或创建一个文件。它返回一个句柄,这个句柄随后...

    直接读写硬盘扇区

    为了能够读写特定的扇区,我们需要使用`SetFilePointer()`函数来设置文件指针的位置。这个函数允许我们定位到任何指定的偏移量处: ```c++ BOOL bRet = SetFilePointer( hDev, // 已打开的设备句柄 dwSector * ...

    Windows_API大全

    - **SetFileTime/mmioSetInfo/SetTextColor/SetFilePointer/SetFileAttributes/SetFileApisToOEM/SetFileSecurity/FindFirstChangeNotification/SetFileTime/mmioSetInfo/SetTextColor/SetFilePointer/...

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

    例如,当你从`CreateFile`函数获取到文件句柄后,可能需要将其转换为整数指针,以便在其他API函数(如`SetFilePointer`和`WriteFile`)中使用。 `CreateFile`是Windows API中的一个重要函数,用于打开或创建文件。...

    vb2017查看硬盘扇区数据

    接下来,`SetFilePointer`函数用于改变文件指针的位置,这对于访问特定扇区至关重要。它的语法如下: ```vb Declare Function SetFilePointer Lib "kernel32" ( _ ByVal hFile As Long, _ ByVal lDistanceToMove ...

    易语言写软盘引导区

    3. **SetFilePointer**:此函数用于设置文件指针的位置,可以用来定位到软盘引导区的起始位置。通常,引导区位于文件的开头,即偏移量为0。 4. **WriteFile**:这是用于向文件或设备写入数据的函数。我们需要先准备...

    易语言读文件查询快捷方式源码

    调用系统API("kernel32", "SetFilePointer", .数据, 0, 0, 2) // 移动文件指针到文件头 .长度 = 系统服务.调用系统API("kernel32", "SetFilePointer", .数据, 0, 0, 1) // 获取文件长度 .缓冲区 = 内存.分配(.长度) ...

    操作系统实验1-系统调用实验.pdf

    操作系统实验1-系统调用...* SetFilePointer 对应于 lseek 系统调用 通过本实验,我们了解了系统调用概念的理解,并掌握了 Linux 操作系统的使用,为进一步理解和学习 Linux 操作系统的内核结构和核心机制奠定了基础。

Global site tag (gtag.js) - Google Analytics