Delphi 加快卷上的createFile调用
我正在写一个软件来和一个录音设备通信 如果通过USB连接到pc,则模拟大容量存储设备。 通过通信可以访问该设备上的某些特殊功能 在该设备的特殊扇区上。在windows上访问该扇区 我需要:Delphi 加快卷上的createFile调用,delphi,winapi,disk,Delphi,Winapi,Disk,我正在写一个软件来和一个录音设备通信 如果通过USB连接到pc,则模拟大容量存储设备。 通过通信可以访问该设备上的某些特殊功能 在该设备的特殊扇区上。在windows上访问该扇区 我需要: 打开新到达的驱动器的手柄 通过deviceIOControl和IOCTLVolumeGetVolumeMediskExtents获取物理驱动器号 打开找到的physicaldrive,读写到一个特殊扇区 到目前为止,一切都很好,但第一个开始就开始了 卷句柄可能需要相当长的时间 我所做的基本上是: var
- 打开新到达的驱动器的手柄
- 通过deviceIOControl和IOCTLVolumeGetVolumeMediskExtents获取物理驱动器号
- 打开找到的physicaldrive,读写到一个特殊扇区
var hdl : THandle;
start, stop, freq : INT64;
begin
hdl := INVALID_HANDLE_VALUE;
QueryPerformanceFrequency(freq);
QueryPerformanceCounter(start);
fHandle := CreateFile( PChar('\\.\' + fDriveLetter + ':'),
GENERIC_READ,
FILE_SHARE_WRITE or FILE_SHARE_READ,
nil,
OPEN_EXISTING,
0,
0);
QueryPerformanceCounter(stop);
OutputDebugString( PChar( Format('Open drive took %.3fms', [(stop - start)/freq*1000]) ));
if hdl = INVALID_HANDLE_VALUE then
raise EVolumeError.Create( 'Cannot Open Drive: '+fDriveLetter+#13#10+
SysErrorMessage(GetLastError));
end;
此呼叫可能需要几秒钟,直到驱动器到达
我的猜测是windows首先读取的是耗时很长的完整FAT
这个小录音设备实际上总是创建
保留完整的磁盘空间(4GB)。
有人知道如何加快这个过程吗?我从来不需要读任何东西
从文件系统,但我需要的是处理获取信息
关于底层physicaldrive编号,并从中执行读写操作。根据msdn,访问卷时,需要至少添加文件共享写入标志。msdn:“打开卷或软盘时,如果您只想发送
IOCTL\u volume\u GET\u volume\u disk\u extends
,定义为FILE\u ANY\u ACCESS
,则dwShareMode参数必须具有FILE\u SHARE\u WRITEflag”-您必须使用FILE\u READ\u属性打开文件,最大值或dwdesired ACCESS中的0。因此,将GENERIC\u READ
更改为0。这会阻止卷装入,并加速我的错误。我混淆了共享标志文件共享写入
和访问标志-文件写入访问
。确实,您需要尝试将访问标志从GENERIC\u READ
更改为0(SYNCHRONIZE
)好的,我会尝试。。。同时,我们更改了录制设备中的群集大小,然后将等待时间减少了8倍(从4kB更改为32kB)。这里真正的问题是-您的磁盘设备是否将由文件系统装载。如果您只发送IOCTL\u VOLUME\u GET\u VOLUME\u DISK\u extends
-您根本不需要filsystem-它无论如何都会将此IOCTL传递给下面的存储设备。如果文件系统装载过程占用了大量时间,您需要避免这种情况。方法-将访问标志更改为最小值-