OberonCore https://forum.oberoncore.ru/ |
|
Как получить имя файловой системы? https://forum.oberoncore.ru/viewtopic.php?f=23&t=6987 |
Страница 1 из 1 |
Автор: | Александр К [ Четверг, 05 Сентябрь, 2024 17:19 ] |
Заголовок сообщения: | Как получить имя файловой системы? |
Доброго времени суток. Я использую WinApi.GetVolumeInformation: Код: PROCEDURE Start*; CONST nVolumeNameSize = 256; nFileSystemNameSize = 256; TYPE Str = ARRAY 100 OF SHORTCHAR; VAR b: WinApi.BOOL; volumeNameBuffer, lpFileSystemNameBuffer: WinApi.PtrSTR; str: Str; lpVolumeSerialNumber, lpMaximumComponentLength, i, contentLock, contentSize, size: INTEGER; lpFileSystemFlags: SET; BEGIN b := WinApi.GetVolumeInformation ("F:\", volumeNameBuffer, SIZE (SHORTCHAR) * nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize); IF b # 0 THEN IF volumeNameBuffer # NIL THEN StdLog.String ("Имя буфера: "); FOR i := 0 TO nVolumeNameSize - 1 DO StdLog.Char (volumeNameBuffer[i]); END; StdLog.Ln; END; IF lpFileSystemNameBuffer # NIL THEN StdLog.String ("Имя файловой системы: "); FOR i := 0 TO nFileSystemNameSize - 1 DO StdLog.Char (volumeNameBuffer[i]); END; StdLog.Ln; END; StdLog.Ln; StdLog.String ("Серийный номер:"); StdLog.Int (lpVolumeSerialNumber); StdLog.Ln; StdLog.String ("Максимальная длина файла:"); StdLog.Int (lpMaximumComponentLength); StdLog.Ln; StdLog.String ("Опции файловой системы: "); StdLog.Set (lpFileSystemFlags); StdLog.Ln; ELSE StdLog.String ("Ошибка"); StdLog.Ln END END Start; END Knysh_keeperDiskSerialNumber. Но переменные volumeNameBuffer и lpFileSystemNameBuffer имеют значение NIL. Хорошо, пробую так: Код: p, p2: WinApi.PtrVoid; BEGIN p := WinApi.HeapAlloc (WinApi.GetProcessHeap(), {}, SIZE (SHORTCHAR) * nVolumeNameSize); SYSTEM.PUT (SYSTEM.ADR (volumeNameBuffer), p); p2 := WinApi.HeapAlloc (WinApi.GetProcessHeap(), {}, SIZE (SHORTCHAR) * nFileSystemNameSize); SYSTEM.PUT (SYSTEM.ADR (lpFileSystemNameBuffer), p2);[/b] b := WinApi.GetVolumeInformation ("F:\", volumeNameBuffer, SIZE (SHORTCHAR) * nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize); Теперь эти переменные выдают какой-то мусор. Что я делаю не так? Может в новых версиях BB есть какой-то более корректный способ работы с дисками, например посредством модуля Files? |
Автор: | Александр К [ Пятница, 06 Сентябрь, 2024 13:17 ] |
Заголовок сообщения: | Re: Как получить имя файловой системы? |
Разобрался: Код: PROCEDURE Start*;
CONST nVolumeNameSize = WinApi.MAX_PATH; nFileSystemNameSize = WinApi.MAX_PATH; VAR b: WinApi.BOOL; volumeNameBuffer, lpFileSystemNameBuffer: WinApi.PtrWSTR; str1: ARRAY nVolumeNameSize OF CHAR; str2: ARRAY nFileSystemNameSize OF CHAR; lpVolumeSerialNumber, lpMaximumComponentLength, i, contentLock, contentSize, size: INTEGER; lpFileSystemFlags: SET; p, p2: WinApi.PtrVoid; long, l2, l3: LONGINT; BEGIN p := WinApi.HeapAlloc (WinApi.GetProcessHeap(), {}, nVolumeNameSize); SYSTEM.PUT (SYSTEM.ADR (volumeNameBuffer), p); p2 := WinApi.HeapAlloc (WinApi.GetProcessHeap(), {}, nFileSystemNameSize); SYSTEM.PUT (SYSTEM.ADR (lpFileSystemNameBuffer), p2); b := WinApi.GetVolumeInformationW ("F:\", volumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize); IF b # 0 THEN IF volumeNameBuffer # NIL THEN FOR i := 0 TO LEN (str1) - 1 DO str1[i] := volumeNameBuffer[i]; END; str1[i - 1] := 0X; END; StdLog.String ("Имя тома: "); StdLog.String (str1); StdLog.Ln; IF lpFileSystemNameBuffer # NIL THEN FOR i := 0 TO LEN (str2) - 1 DO str2[i] := lpFileSystemNameBuffer[i]; END; str2[i - 1] := 0X; END; StdLog.String ("Имя файловой системы: "); StdLog.String (str2); StdLog.Ln; long := ABS (LONG (MIN (INTEGER))) + 1; l2 := ABS (lpVolumeSerialNumber); l3 := MAX(INTEGER); long := long - l2 + l3; StdLog.String ("Серийный номер:"); StdLog.Int (lpVolumeSerialNumber); StdLog.String (" т.е. "); StdLog.Int (long); StdLog.Ln; StdLog.String ("Максимальная длина файла:"); StdLog.Int (lpMaximumComponentLength); StdLog.Ln; StdLog.String ("Опции файловой системы: "); StdLog.Set (lpFileSystemFlags); StdLog.Ln; ELSE StdLog.String ("Ошибка"); StdLog.Ln END END Start; |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |