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/