OberonCore
https://forum.oberoncore.ru/

Получение информации о файловой системе
https://forum.oberoncore.ru/viewtopic.php?f=27&t=169
Страница 1 из 1

Автор:  vladfind [ Пятница, 21 Апрель, 2006 23:38 ]
Заголовок сообщения:  Получение информации о файловой системе

Вот решил поупражняться и вызывать функции WinAPI из BB.

Стало необходимо определить тип файловой системы, в котором стартует приложение EXE. Помучался чуть-чуть. Спасибо добрым людям на форуме, которые подсказали как назначить типы параметров в функциях WinApi.

Исходный текст модуля:
http://robot-ivan.narod.ru/blackbox/simple_exe.txt [~ 6 Кбайт]

EXE - инкарнация исходника simple_exe.txt
http://robot-ivan.narod.ru/blackbox/isfs.exe [~ 6,1 Кбайт]

ТЕСТ:
  • FAT - Ok'
  • FAT32 - Ok'


Помогите проверить на других файловых системах(FAT12, NTFS) !

Автор:  Илья Ермаков [ Пятница, 21 Апрель, 2006 23:47 ]
Заголовок сообщения: 

Пробовал на NTFS - работает.

На FAT12 - на дискету закиньте и попробуйте...

Автор:  vladfind [ Суббота, 22 Апрель, 2006 09:00 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Пробовал на NTFS - работает.

На FAT12 - на дискету закиньте и попробуйте...


Скинул и получил FAT. Это наверное FAT16? В описании по правилу написания имен для файловой системы обнаружил 'VFAT'. Это FAT32?

Автор:  Илья Ермаков [ Суббота, 22 Апрель, 2006 09:49 ]
Заголовок сообщения: 

FAT - это FAT12, на дискетах применяется он и только он.

VFAT - это модификация FAT16, сделанная в Windows95/Dos 7.0. Основное отличие - поддержка длинных имен файлов. Обратно совместима с оригинальной FAT16 (старых версий DOS).

Автор:  vladfind [ Понедельник, 24 Апрель, 2006 23:21 ]
Заголовок сообщения: 

Вызов WinAPI и получение информации о дисках на компьютере:
    GetLogicalDrives()
    GetVolumeInformation(...)
    GetDriveType(..)
    GetCurrentDirectory(..)


Исходный код модуля: http://robot-ivan.narod.ru/blackbox/workfiles.txt (~ 6,7 Кбайт).

Что можно добавить? Можно сообщить пользователю о результате выполнения вызова WinAPI в случаях неудачи.

Автор:  Alexey Veselovsky [ Вторник, 25 Апрель, 2006 16:29 ]
Заголовок сообщения: 

vladfind писал(а):
Вызов WinAPI и получение информации о дисках на Исходный код модуля: http://robot-ivan.narod.ru/blackbox/workfiles.txt (~ 6,7 Кбайт).


А можно исходный текст в виде обычного текста? А то БлэкБокса сейчас под рукой нет, соответственно исходник смотреть не чем...

Автор:  vladfind [ Вторник, 25 Апрель, 2006 20:28 ]
Заголовок сообщения: 

WorkFiles.odc
    GetLogicalDrives()
    GetVolumeInformation(...)
    GetDriveType(..)
    GetCurrentDirectory(..)


Код:
(*
****************************************************
* @author       В. Васильев
*               Mailto :vladprg@land.ru
*               Site: www.robot-ivan.narod.ru
*****************************************************
*)

MODULE  LasmWorkFiles;

IMPORT SYSTEM, WinApi, Math, StdLog;

VAR
      i: INTEGER;
      st: SET;
      LogDrives: SET;
      b: BOOLEAN;
      d : INTEGER;
      n : INTEGER;
      r : INTEGER;
      re : REAL;
VAR
       s0: ARRAY 255 OF SHORTCHAR;
       s1: ARRAY 255 OF CHAR;
       s2: POINTER TO  ARRAY OF CHAR;
       LogicalDriveString : ARRAY 32 OF CHAR;

VAR
      DrivesLogical : INTEGER;
      DrivesLogicalString : ARRAY 255 OF SHORTCHAR;
      CurrentDirectory : ARRAY 255 OF SHORTCHAR;

      DrivesType : ARRAY 255 OF SHORTCHAR;
      RootPathName: ARRAY 255 OF SHORTCHAR;
      VolumeNameBuffer : ARRAY 255 OF SHORTCHAR;
      FileSystemNameBuffer : ARRAY 255 OF SHORTCHAR;



PROCEDURE PrintArrayShort*(pArrCharShort : ARRAY OF SHORTCHAR);

     VAR
           j: INTEGER;
           SizeArr : INTEGER;
           ArrChar: POINTER TO ARRAY OF CHAR;

   BEGIN
      SizeArr := LEN(pArrCharShort);
      NEW(ArrChar,SizeArr);

     FOR j := 0 TO SizeArr-1 DO
        ArrChar[j] :=  pArrCharShort[j];
       (* StdLog.Char(FileSystemNameBuffer[j]) *)
     END;
     StdLog.String(ArrChar);

END  PrintArrayShort;

PROCEDURE Do*;


BEGIN  (* Do *)
    NEW(s2, 100);

    StdLog.String("ТЕСТ"); StdLog.Ln;

    DrivesLogical := WinApi.GetLogicalDrives();
    StdLog.String("Какие диски на компьютере?"); StdLog.Ln;
    LogDrives := BITS(DrivesLogical);

   FOR i:=0 TO 31 DO
     IF  i  IN LogDrives THEN
           LogicalDriveString[i] := CHR(ORD('A')+i); (* имя диска *)
           StdLog.String("=> "); StdLog.Char(LogicalDriveString[i]); StdLog.String(":\"); StdLog.Ln;

                        s1[0]   :=  LogicalDriveString[i];
                        s1[1] := ":";
                        s1[2] := "\";
                RootPathName := SHORT(s1);

                    r :=  WinApi.GetVolumeInformation(RootPathName, VolumeNameBuffer, 255, d, NIL, NIL, FileSystemNameBuffer,255);

   StdLog.String("       Какое имя метки диска?"); StdLog.String(" => ");       PrintArrayShort(VolumeNameBuffer); StdLog.Ln;

   StdLog.String("       Какая файловая система?"); StdLog.String(" => ");      PrintArrayShort(FileSystemNameBuffer); StdLog.Ln;

   StdLog.String("       Какой серийный номер диска?"); StdLog.String(" => ");  StdLog.Int(d);  StdLog.Ln;

              r :=  WinApi.GetDriveType(RootPathName);

   StdLog.String("       Какой тип диска?"); StdLog.String(" => ");
           CASE  r OF
             0 : StdLog.String("DRIVE_UNKNOWN");
           | 1 : StdLog.String("DRIVE_NO_ROOT_DIR");
           | 2 : StdLog.String("DRIVE_REMOVABLE");
           | 3 : StdLog.String("DRIVE_FIXED");
           | 4 : StdLog.String("DRIVE_REMOTE");
           | 5 : StdLog.String("DRIVE_CDROM");
           | 6 : StdLog.String("DRIVE_RAMDISK");
           END;
           StdLog.Ln;
     ELSE
           LogicalDriveString[i] := 20X; (*пробел*)
     END;
   END;


    StdLog.Ln; StdLog.String("Какой текущий диск?"); StdLog.Ln;

    r := WinApi.GetVolumeInformation(NIL, VolumeNameBuffer, 100, d, NIL, NIL, FileSystemNameBuffer,100);

   StdLog.String("       Какое имя метки диска?"); StdLog.String(" => ");       PrintArrayShort(VolumeNameBuffer); StdLog.Ln;

   StdLog.String("       Какая файловая система?"); StdLog.String(" => ");      PrintArrayShort(FileSystemNameBuffer); StdLog.Ln;

   StdLog.String("       Какой серийный номер диска?"); StdLog.String(" => ");  StdLog.Int(d);  StdLog.Ln;

StdLog.Ln;
  r := WinApi.GetCurrentDirectory(255, CurrentDirectory);
   StdLog.String("Какой текущий  каталог?"); StdLog.String(" => ");     PrintArrayShort(CurrentDirectory); StdLog.Ln;

  END Do;

END  LasmWorkFiles.

Автор:  vladfind [ Вторник, 25 Апрель, 2006 20:35 ]
Заголовок сообщения: 

Вопросы для Гуру по файловой системе FAT,VFAT, FAT32, NTFS .

1. Сколько вложенных каталогов можно создать?
2. Пусть у нас FAT32. Максимальная длина имени файла 255 символов (точно?). Создать N подкаталогов. Тогда длина символьного массива для возврата текущего каталога:
    Длина массива= N * 255 (* Правильно? *)

Автор:  Илья Ермаков [ Вторник, 25 Апрель, 2006 21:14 ]
Заголовок сообщения: 

Могу сказать точно, что как в VFAT-FAT32, так и в NTFS, ограничивается не только длина имени файла (256 символов), но и длина пути до файла (если не ошибаюсь - 260 символов. По крайней мере, строковые типы для имен путей обычно объявляются так). Т.е. если мы создаем файл с именем в 256 символов, то мы можем положить его в папку с именем в 4 символа или в 4 вложенных папки с именами из одного символа. Глубже уже нельзя.
Поэтому число вложенных каталогов можно считать ограниченным 260 - и то если они будут однобуквенными. А так - еще меньше.

Однако я не могу сказать точно, накладывается ли ограничение на длину пути файловой системой как структурой разметки, или это просто ограничение ОС, которой "неохота" выделять под пути более длинные строки.

Автор:  Trurl [ Среда, 26 Апрель, 2006 07:54 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Поэтому число вложенных каталогов можно считать ограниченным 260 - и то если они будут однобуквенными.

Можно смело делить на 2, "/" надо учитывать. :)
Вообще, есть возможность использовать пути в 32000 символов, но только в NT из CreateFileW.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/