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

Sui*_*hX2 2 delphi api pascal delphi-2009

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

SetFilePointer(PD,0,nil,FILE_BEGIN);
SetLength(Buffer,512);
ReadFile(PD,Buffer[0],512,BytesReturned,nil);
Run Code Online (Sandbox Code Playgroud)

但是,GetFileSize的限制为2GB,SetFilePointer也是如此.我有绝对不知道如何delcare一个外部API,我已经看了RTL和谷歌搜索了很多例子,并没有找到正确的答案.

我试过这个

function GetFileSizeEx(hFile: THandle; lpFileSizeHigh: Pointer): DWORD; 
    external 'kernel32';
Run Code Online (Sandbox Code Playgroud)

并按照建议这样做

function GetFileSizeEx(hFile: THandle; var FileSize: Int64): DWORD;
    stdcall; external 'kernel32';
Run Code Online (Sandbox Code Playgroud)

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

我正在使用SetFilePointer跳转每512字节和ReadFile写入缓冲区,反过来我可以使用它来设置我何时使用WriteFile将初始程序加载程序代码或其他内容写入磁盘.我需要能够将文件指针设置超出2gb.

有人可以帮我做外部声明和调用GetFileSizeEx和SetFilePointerEx工作,所以我可以修改我的旧代码,使用4到32GB的闪存卡.

Dav*_*nan 8

我建议你看看这本Primoz Gabrijelcic博客文章和他的GpHugeFile单元,它应该给你足够的指针来获取文件大小.

编辑1根据对问题的编辑,现在看起来相当愚蠢.

编辑2现在已经接受了这个答案,经过对jachguate答案的长篇评论,我觉得有必要总结已经学到的东西.

最后,如果您需要使用GetFileSizeEx,SetFilePointerEx那么它们可以声明如下:

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';
Run Code Online (Sandbox Code Playgroud)

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