- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不知道如何使用 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 的答案进行了大量评论之后,我觉得有责任总结一下所学到的内容。
GetFileSize
和 SetFilePointer
没有2GB限制,它们可以用于文件基本上是任意大小的。
GetFileSizeEx
和 SetFilePointerEx
很多更容易使用,因为它们有效直接使用 64 位数量和错误条件要简单得多信号。
OP 实际上不需要计算他的磁盘大小。自从OP正在阅读全文磁盘内容的大小不是需要。所需要的只是依次读取内容,直到什么都没有剩下。
事实上 GetFileSize
/GetFileSizeEx
不支持设备句柄(例如物理磁盘或卷)作为应OP的要求。更重要的是, SetFilePointer
/SetFilePointerEx
无法找到此类设备的末尾 handle 。
为了获取a的大小磁盘、卷或分区,应该通过该 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';
获取这些 API 导入的一种简单方法是通过优秀的 JEDI API Library .
关于Delphi Pascal - 使用 SetFilePointerEx 和 GetFileSizeEx,在读取文件时获取物理媒体的确切大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4567422/
目前,我正在使用 GetFileSizeEx 来跟踪日志文件在写入之前的大小。我们的空间有限,如果我们尝试创建大于 100 兆字节的文件,我们将停止记录数据。问题是出于某种原因,GetFileSize
我在创建命名共享内存和检查其大小时遇到问题。当我在这样的函数中调用它时,函数 GetFileSizeEx 失败。关于如何调试这个的任何想法? void test_getsize(const cha
我遇到了一个关于 GetFileSize 和 GetFileSizeEx API 的非常奇怪的问题。 除了来自 System32 目录的文件外,这两个函数都适用于每个输入文件。 例如: 如果我在 ca
我不知道如何使用 RTL 之外的任何 API。我一直在使用 SetFilePointer 和 GetFileSize 将物理磁盘读入缓冲区并将其转储到文件中,这样的循环可以完成 2GB 以下闪存卡的工
当我在只读文件上使用我的 Delphi 6 应用程序中的 Windows API 调用 GetFileSizeEx() 时,我收到操作系统错误代码 6(“无效文件句柄”)。如果我从文件中删除只读属性,
我是一名优秀的程序员,十分优秀!