gpt4 book ai didi

Delphi Pascal - 使用 SetFilePointerEx 和 GetFileSizeEx,在读取文件时获取物理媒体的确切大小

转载 作者:行者123 更新时间:2023-12-02 19:10:39 25 4
gpt4 key购买 nike

我不知道如何使用 RTL 之外的任何 API。我一直在使用 SetFilePointer 和 GetFileSize 将物理磁盘读入缓冲区并将其转储到文件中,这样的循环可以完成 2GB 以下闪存卡的工作:

SetFilePointer(PD,0,nil,FILE_BEGIN);
SetLength(Buffer,512);
ReadFile(PD,Buffer[0],512,BytesReturned,nil);

但是 GetFileSize 的限制为 2GB,SetFilePointer 也是如此。我完全不知道如何删除外部 API,我查看了 RTL 并在 google 上搜索了许多示例,但没有找到正确的答案。

我试过了

function GetFileSizeEx(hFile: THandle; lpFileSizeHigh: Pointer): DWORD; 
external 'kernel32';

正如建议的那样

function GetFileSizeEx(hFile: THandle; var FileSize: Int64): DWORD;
stdcall; external 'kernel32';

但即使我使用的是有效的磁盘句柄,该函数也会返回 0,并且我已经使用旧 API 确认并转储了数据。

我使用 SetFilePointer 每 512 个字节跳转一次,使用 ReadFile 写入缓冲区,相反,当我使用 WriteFile 将初始程序加载器代码或其他内容写入磁盘时,我可以使用它进行设置。我需要能够将文件指针设置为超过 2GB。

有人可以帮我进行外部声明并调用 GetFileSizeEx 和 SetFilePointerEx 吗?这样我就可以修改我的旧代码以使用 4 到 32gb 闪存卡。

最佳答案

我建议你看看这个Primoz Gabrijelcic blog article和他的GpHugeFile单位应该给你足够的指针来获取文件大小。

编辑 1 鉴于对问题的编辑,现在这看起来相当愚蠢。

编辑 2 既然这个答案已被接受,在对 jachguate 的答案进行了大量评论之后,我觉得有责任总结一下所学到的内容。

  • GetFileSizeSetFilePointer没有2GB限制,它们可以用于文件基本上是任意大小的。

  • GetFileSizeExSetFilePointerEx很多更容易使用,因为它们有效直接使用 64 位数量和错误条件要简单得多信号。

  • OP 实际上不需要计算他的磁盘大小。自从OP正在阅读全文磁盘内容的大小不是需要。所需要的只是依次读取内容,直到什么都没有剩下。

  • 事实上 GetFileSize/GetFileSizeEx不支持设备句柄(例如物理磁盘或卷)作为应OP的要求。更重要的是, SetFilePointer/SetFilePointerEx无法找到此类设备的末尾 handle 。

  • 为了获取a的大小磁盘、卷或分区,应该通过该 IOCTL_DISK_GET_LENGTH_INFO控制代码到 DeviceIoControl .

最后,您是否需要使用 GetFileSizeExSetFilePointerEx那么它们可以声明如下:

function GetFileSizeEx(hFile: THandle; var lpFileSize: Int64): BOOL;
stdcall; external 'kernel32.dll';
function SetFilePointerEx(hFile: THandle; liDistanceToMove: Int64;
lpNewFilePointer: PInt64; dwMoveMethod: DWORD): BOOL;
stdcall; external 'kernel32.dll';

获取这些 API 导入的一种简单方法是通过优秀的 JEDI API Library .

关于Delphi Pascal - 使用 SetFilePointerEx 和 GetFileSizeEx,在读取文件时获取物理媒体的确切大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4567422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com