delphi - Delphi TFileStream WriteBuffer Int64的大小不是吗?我一次只能写少量
问题描述
我正在尝试编写更大的块以提高文件保存的速度。我有大约 9 个循环要转换,但我不知道我做错了什么
fs := TFileStream.Create(Myfile, fmCreate);
此代码有效:
for RecordGroup := 0 to TotalGroups - 1 do
begin
for RecordNumber := 0 to Length(MyArray[RecordGroup]) - 1 do
begin
fs.WriteBuffer(MyArray[RecordGroup,RecordNumber],SizeOf(MyRecord));
end;
end;
当我删除内部循环以编写更大的块时,代码不起作用:
for RecordGroup := 0 to TotalGroups - 1 do
begin
fs.WriteBuffer(MyArray[RecordGroup],SizeOf(MyRecord) * Length(MyArray[RecordGroup]));
end;
我收到一般错误“流写入错误”
的值为SizeOf(MyRecord) * Length(MyArray[RecordGroup])
180 * 152,004 = 27,360,720
我读过的所有内容基本上都说这是正确的。任何想法我做错了什么?
提前感谢您的任何想法。
解决方案
将编写代码更改为(注意方括号中的附加 0)
fs.WriteBuffer(MyArray[RecordGroup, 0], SizeOf(MyRecord) * Length(MyArray[RecordGroup]));
错误在于错误的动态数组使用。我假设这MyArray
是二维数组,MyArray[RecordGroup]
一维动态数组也是如此——本质上是指向数据的指针——但无类型的 var 参数WriteBuffer
需要使用数组数据体。
旁注 - 您的 for 循环计数器从 0 变为TotalGroups
,因此循环总数为TotalGroups + 1
. 这是正确的吗?
推荐阅读
- flutter - 在 Flutter 应用程序中为每个屏幕设置不同的方向会导致大量延迟
- python - 如何四舍五入到特定的预定义数字?
- spi - 将 ESP32(Lolin32 Lite 开发板)连接到 7 针 SPI TFT 显示器 ST7789 驱动程序
- html - 如何在点击时更改 MaterialTable 单元格内容?
- angular - Angular 6 多层次的 RoutingModule
- python-2.7 - 如何使用 if 语句返回 Python 中的先前代码?
- php - 选择在哪里 - 自定义订单
- dart - 在列中放置一个小部件会在布局期间为 RenderIndexedStack 对象提供无限大小
- java - 如何在浓缩咖啡中以编程方式单击 Android 手机的“主页”按钮
- python-3.x - 从可执行文件中获取文件的文件名