Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 是否有办法确定文件系统不是NTFS(如FAT16、exFAT…)的可移动驱动器的物理扇区大小?_Delphi_Filesystems_Disk - Fatal编程技术网

Delphi 是否有办法确定文件系统不是NTFS(如FAT16、exFAT…)的可移动驱动器的物理扇区大小?

Delphi 是否有办法确定文件系统不是NTFS(如FAT16、exFAT…)的可移动驱动器的物理扇区大小?,delphi,filesystems,disk,Delphi,Filesystems,Disk,我需要一个函数来获取Win7或更高版本中所有类型系统驱动器的物理扇区大小 这是我一直使用的代码,直到今天,当我发现它不适用于我的外部USB HDD(exFAT文件系统)和USB MP3播放器(FAT16)。在这些情况下,功能DeviceIoControl失败,我得到异常:“系统错误。代码50。请求不受支持”。但它在NTFS卷上运行得非常好 function GetSectorSize(Drive:Char):DWORD; var h:THandle; junk:DWORD; Qu

我需要一个函数来获取Win7或更高版本中所有类型系统驱动器的物理扇区大小

这是我一直使用的代码,直到今天,当我发现它不适用于我的外部USB HDD(exFAT文件系统)和USB MP3播放器(FAT16)。在这些情况下,功能
DeviceIoControl
失败,我得到异常:“系统错误。代码50。请求不受支持”。但它在NTFS卷上运行得非常好

function GetSectorSize(Drive:Char):DWORD;
var h:THandle;
    junk:DWORD;
    Query:STORAGE_PROPERTY_QUERY;
    Alignment:STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR;
begin
 result:=0;
 h:=CreateFileW(PWideChar('\\.\'+UpperCase(Drive)+':'),0,FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);
 if h=INVALID_HANDLE_VALUE then RaiseLastOSError;
 try
  FillChar(Query,SizeOf(Query),0);
  Query.PropertyId:=StorageAccessAlignmentProperty;
  Query.QueryType:=PropertyStandardQuery;
  if not DeviceIoControl(h,IOCTL_STORAGE_QUERY_PROPERTY,@Query,SizeOf(Query),@Alignment,SizeOf(Alignment),junk,nil) then RaiseLastOSError;
  result:=Alignment.BytesPerPhysicalSector;
 finally
  CloseHandle(h);
 end;
end;
根据MSDN:

大多数当前的Windows API,如IOCTL_DISK_GET_DRIVE_GEOMETRY和GetDiskFreeSpace,将返回逻辑扇区大小,但物理扇区大小可以通过控制代码检索,相关信息包含在结构中的BytesPerPhysicalSector成员中。例如,请参阅。上的示例代码。Microsoft强烈建议开发人员将无缓冲I/O与IOCTL_STORAGE_QUERY_属性控制代码报告的物理扇区大小对齐,以帮助确保他们的应用程序为此扇区大小转换做好准备

此报价也出现在以下MSDN文档中:

其中包括以下附加信息:

下表总结了作为Windows 8和Windows Server 2012一部分提供的新功能,以帮助改善客户和开发人员使用大扇区磁盘的体验。每个项目的详细说明如下。

•提供新的API来查询物理扇区大小(FileFsSectorSizeInformation)

以下是如何查询物理扇区大小:
Windows 8的首选方法

在Windows8中,微软引入了一种新的API,使开发者能够轻松地将4K支持集成到他们的应用程序中。与下面讨论的Windows Vista和Windows 7的旧方法相比,此新API支持更多的场景。此API支持以下调用场景:

•从非特权应用程序呼叫
•调用任何有效的文件句柄
•通过SMB2调用远程卷上的文件句柄
•简化的编程模型

该API以一个新的信息类FileFsSectorSizeInformation的形式出现,该类具有相关的结构文件\u FS\u扇区\u大小\u信息

可以通过以下任一方式查询此信息:

•调用或,传递FileFsSectorSizeInformation作为FileInformationClass的值,并传递调用方分配的FILE\FS\u SECTOR\u SIZE\u INFORMATION结构化缓冲区作为FileInformation的值

•创建带有主要功能代码的IRP

•使用指向文件\u FS\u扇区\u大小\u信息的指针调用结构化缓冲区。当从FsRtlGetSectorSizeInformation返回此结构时,FileSystemEffectivePhysicalBytesPerSectorForAtomicity成员将没有文件系统初始化的值。文件系统驱动程序通常会调用此函数,然后为FileSystemEffectivePhysicalBytesPerSectorForAtomicity设置自己的值


您的主要错误是试图从卷句柄而不是从底层物理设备(
\\.\PhysicalDriveX
)获取物理扇区大小。设备的物理扇区大小不取决于FS,不应与FS属性定义的逻辑扇区大小混淆。

这些驱动器是高级格式驱动器吗?关于这些硬盘,
fsutil
告诉了你什么。带FAT16的MP3播放器我认为它不能是高级格式(它只是一个U盘,
fsutil fsinfo ntfssinfo
不适用于其他USB硬盘,因为它是exFAT,但我认为它可以是高级格式,因为它有1TB@marusnebunu:您应该对该评论进行扩展,因为同一句话的其余部分解释了如何获得物理扇区大小。是的,我已经这样做了(参见我问题中的函数),而且它可以在NTFS文件系统中正常工作,但不能在exFAT或FAT16中正常工作。不幸的是,从Windows 8.Right开始,可以使用
文件\u FS\u扇区\u大小\u信息
结构。您可以在Vista和Win7中使用
IOCTL\u STORAGE\u QUERY\u属性。物理扇区大小在早期版本中没有公开,您必须使用
IOCTL\u DISK\u GET\u DRIVE\u GEOMETRY
或同等产品。我不相信这一点。MSDN示例代码表明,指定映射的驱动器名是可以的:不,即使使用
\\。\PhysicalDriveX
,它也不起作用。我已经测试过了。