1

赢阿皮

WINAPI GetVolumeInformation(
_In_opt_   LPCTSTR lpRootPathName,
_Out_opt_  LPTSTR lpVolumeNameBuffer,
_In_       DWORD nVolumeNameSize,
_Out_opt_  LPDWORD lpVolumeSerialNumber,
_Out_opt_  LPDWORD lpMaximumComponentLength,
_Out_opt_  LPDWORD lpFileSystemFlags,
_Out_opt_  LPTSTR lpFileSystemNameBuffer,
_In_       DWORD nFileSystemNameSize
);

您好:我想将 windows api GetVolumeInformation 移植到 Linux。

Q1:Linux是否有相同的功能。

Q2:如果没有。

Q2.1 linux中的lpVolumeNameBuffer是什么(是/dev/sda1)?我怎样才能在linux中得到它?

Q2.2 什么是 linux 中的 lpVolumeSerialNumber(is )?我用 ioctl 得到它。

struct hd_driveid id;ioctl(fd, HDIO_GET_IDENTITY, &id);

Q2.3 linux中的lpMaximumComponentLength是什么?我怎样才能在linux中得到它?

Q2.4 linux中的lpFileSystemFlags是什么?我怎样才能在linux中得到它?

Q2.5 什么是lpFileSystemNameBuffer?我怎样才能在linux中得到它?

如果您有任何好的想法,我将不胜感激。

谢谢!

4

2 回答 2

2

POSIX 系统具有statvfs()/ fstatvfs() 子例程(可能是库函数或系统调用,具体取决于操作系统)。也许它们与您命名的 Windows 功能最相似,但它们的界面非常不同。

我不知道这对你是否重要,但一个相关的问题是枚举挂载的文件系统。要枚举 Linux 上当前挂载的文件系统,您可以读取/proc/mounts. 其他一些 UNIX 风格(即 BSD 派生系统)具有getvfsstat()/ getfsstat() 调用用于相同目的。Solaris 没有(或过去没有),您最好的选择是阅读/etc/mnttab. AIX 没有这些,而您(唯一?)用于枚举当前挂载的可靠 (?) 选项是解析mount命令的输出,不带任何参数运行。

于 2013-07-03T21:20:56.453 回答
2

从概念上讲,linux 不像 Windows 那样有卷 - linux 有挂载点,Windows 有“驱动器号”,因为没有更好的术语。

lpVolumeName是已安装卷的友好名称 - 例如,我的C:驱动器标记为“main_disk”。这个标签的意义只是为了给驱动起一个好记的名字,只要用户决定改变它,这个标签就可以改变,它不影响最终文件系统布局的结构。

在 linux 中,卷作为挂载点挂载,例如,被称为 的设备/dev/sda2可能挂载在/var挂载点。在这里,/var是文件系统的一部分,因此,挂载点决定了最终文件系统布局的结构。这不仅仅是用户给他们的磁盘提供的友好名称,以便他们知道它是什么。

Linux 和其他人确实支持称为磁盘标签的东西,但过去能够使用稳定名称而不是设备名称来引用磁盘,如果硬盘驱动器在计算机中移动,设备名称可能会发生变化。例如,在 FreeBSD 中,我可以标记我的主硬盘root;当在启动过程中检测到该硬盘驱动器时,我可以将其称为/dev/label/root并使用该名称为其指定安装点。然而,这仍然被用来确定文件系统的最终结构——它是一种功能依赖——因此用户不能在不破坏某些东西或不得不更改fstab描述设备到挂载的文件的情况下随意更改它点映射。

lpVolumeSerialNumber与卷上的文件系统有关;也就是说,该字段特定于卷上正在使用的文件系统,并不是所有卷都具有的。

在 Windows 中,通常支持两个文件系统 - Fat32 和 NTFS - 两者都可以为文件系统提供序列号。在Linux、FreeBSD等中,有很多很多的文件系统——UFS/UFS2、EXT/EXT2/EXT3/EXT4、ReiserFS/Reiser4、BTRFS、ZFS、FFS等。卷有没有序列号取决于卷正在使用什么文件系统,并且并非所有文件系统都支持序列号。每个文件系统都有自己的实用程序命令来查询此类数据 - 例如,dumpfs在 FreeBSD 上用于 UFS2 文件系统。

名单还在继续。不幸的是,对于您所询问的部分,Windows 和 Linux 之间没有直接的类似物,但正如我所展示的,有时它并不重要,当它发生时,您通常可以找到一些东西来替换它。

于 2013-07-03T13:41:08.740 回答