相关疑难解决方法(0)

缓冲文件(用于更快的磁盘访问)

我正在处理大文件,直接写入磁盘很慢.因为文件很大,我无法在TMemoryStream中加载它.

TFileStream没有缓冲,所以我想知道是否有一个可以提供缓冲流的自定义库,或者我是否应该只依赖OS提供的缓冲.OS缓冲是否可靠?我的意思是如果缓存已满,可以从缓存中刷新旧文件(我的)以便为新文件腾出空间.

我的文件在GB范围内.它包含数百万条记录.不幸的是,记录不是固定大小.所以,我必须做数百万的读数(4到500字节之间).阅读(和写作)是顺序的.我不会上下跳进文件(我认为这是缓冲的理想选择).

最后,我必须将这样的文件写回磁盘(再次写入数百万的小写).


对David Heffernan赞不绝口!
David提供了一段很棒的代码,提供缓冲磁盘访问.
人们你必须拥有他的BufferedFileStream!这是黄金.并且不要忘记upvote.

谢谢大卫.

delphi io buffer file stream

43
推荐指数
4
解决办法
1万
查看次数

在Windows 10上使用ERROR_NOT_SUPPORTED打印机CreateDC/CreateIC失败

我试图打电话CreateDC来创建一个打印机设备上下文:

printerDC := CreateDC('WINSPOOL', 'HP DeskJet 930C/932C/935C', nil, nil);
Run Code Online (Sandbox Code Playgroud)

该代码适用于Windows 7,但在Windows 10中失败 - 返回null.

我真的在使用真正的打印机:

在此输入图像描述

什么通过

MSDN文档说,如果你想获得打印机设备上下文,你必须通过WINSPOOL作为驱动:

如何:检索打印机设备上下文

要渲染到特定打印机,必须将"WINSPOOL"指定为设备,并将正确的打印机名称传递给CreateDC.如果要在创建设备上下文时为设备驱动程序提供特定于设备的初始化数据,也可以在调用CreateDC时传递DEVMODE结构.

以下示例显示了对CreateDC的调用,其中选择了"WINSPOOL"驱动程序,并且按名称指定了打印机名称.C++

printerDC = CreateDC( L"WINSPOOL", printerName, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

我提到它,因为有很多代码通过:

  • 空字符串
  • 空值
  • 设备的名称
  • 驱动程序的名称
  • winspool
  • WINSPOOL

背景

深入Delphi VCL框架Vcl.Printers是对Windows功能的调用CreateIC.在我的Windows 10桌面上,调用失败(返回NULL而不是有效的信息上下文).

CreateIC功能不记录任何失败的方式.它也没有记录它支持调用GetLastError以获取错误.但如果我打电话给GetLastError我得到错误代码50:

ERROR_NOT_SUPPORTED  
50 (0x32)  
The request is not …
Run Code Online (Sandbox Code Playgroud)

printing winapi windows-10

5
推荐指数
0
解决办法
2940
查看次数

标签 统计

buffer ×1

delphi ×1

file ×1

io ×1

printing ×1

stream ×1

winapi ×1

windows-10 ×1