2013-07-03 2 views
0

победа ApiПорт Окно Api --- GetVolumeInformation для Linux

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.

Вопрос 1: Имеет ли Linux ту же функцию.

Q2: если нет.

Q2.1 что такое lpVolumeNameBuffer в linux (is/dev/sda1)? как я могу получить его в Linux?

Q2.2 что такое lpVolumeSerialNumber в linux (is)? Я использую ioctl.

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

В2.3 что lpMaximumComponentLength в Linux? как я могу получить его в Linux?

Q2.4 что такое lpFileSystemFlags в Linux? как я могу получить его в Linux?

Q2.5 что такое lpFileSystemNameBuffer? как я могу получить его в Linux?

Если у вас есть хорошие идеи, я бы очень признателен.

Спасибо!

+0

В Linux нет прямой аналогии. Полезный ответ будет зависеть от того, что вы делаете с этими данными впоследствии. – rodrigo

+0

Привет: Спасибо за ваш ответ! Эти данные я буду использовать в своей программе. Есть ли у вас желание их получить? Благодаря! –

ответ

1

Концептуально, 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 для тех частей, о которых вы просите, но, как я показал, иногда это не имеет значения, и когда это происходит, вы обычно можете найти что-то, чтобы заменить его.

+0

HI: Спасибо за вашу помощь. Я нахожу statfs. Я использую statfs (pname, &buf); получить их. Но у меня есть другой вопрос. я COUT fsid_t f_fsid; Спасибо –

1

POSIX системы имеют statvfs)/fstatvfs() подпрограммы ((что может быть функцией библиотеки или системный вызов, в зависимости от операционной системы). Возможно, это то, что наиболее похоже на то, что вы называете функцией Windows, но у них совсем другой интерфейс.

Я не знаю, имеет ли это значение для вас, но связанная с этим проблема заключается в перечислении смонтированных файловых систем. Чтобы перечислить текущие смонтированные файловые системы в Linux, вы можете прочитать содержимое /proc/mounts. Некоторые другие стили UNIX (а именно BSD-производные системы) имеют getvfsstat()/getfsstat(), которые требуют той же цели. Solaris имеет (или раньше), и вам лучше всего было читать /etc/mnttab. В AIX нет ни одного из них, и ваш (только?) Надежный (?) Вариант для перечисления текущих монтировок должен анализировать вывод команды mount, запускаться без каких-либо аргументов.

+0

HI: Благодарим Вас за help.I найти statfs я использую statfs (PNAME, &buf); получить их. .Но у меня есть другой вопрос. Как я могу cout fsid_t f_fsid; Спасибо! –

+1

В manpage, которую вы упомянули, должен быть раздел «ПРИМЕЧАНИЯ» с подразделением конкретно в поле 'f_fsid'. Возможно, вы можете попробовать предложение о передаче это системный вызов 'sysfs'(). Или, если у вас есть конкретная цель, возможно, вы могли бы рассказать об этом нам. В зависимости от того, что вы хотите, может быть несвязанный и более простой способ сделать это. – Paulo1205

Смежные вопросы