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的闪存卡.
我建议你看看这本Primoz Gabrijelcic博客文章和他的GpHugeFile单元,它应该给你足够的指针来获取文件大小.
编辑1根据对问题的编辑,现在看起来相当愚蠢.
编辑2现在已经接受了这个答案,经过对jachguate答案的长篇评论,我觉得有必要总结已经学到的东西.
GetFileSize并且
SetFilePointer没有2GB限制,它们可以用于基本上任意大小的文件.
GetFileSizeEx并且
SetFilePointerEx更容易使用,因为它们直接使用64位数量并且具有更简单的错误条件信号.
OP实际上并不需要计算他的磁盘大小.由于OP正在读取磁盘的全部内容,因此不需要大小.所需要的只是按顺序读取内容,直到没有任何东西为止.
实际上
GetFileSize/ GetFileSizeEx
不支持OP请求的设备(例如物理磁盘或卷)的句柄.更重要的是,
SetFilePointer/ SetFilePointerEx
不能寻求这种设备句柄的结束.
为了获得磁盘,卷或分区的大小,应该将IOCTL_DISK_GET_LENGTH_INFO
控制代码传递
给
DeviceIoControl.
最后,如果您需要使用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库.