OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 19 Апрель, 2024 07:16

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 21 Апрель, 2006 23:38 

Зарегистрирован: Понедельник, 12 Декабрь, 2005 22:44
Сообщения: 85
Откуда: С.-Петербург
Вот решил поупражняться и вызывать функции 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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Пробовал на NTFS - работает.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 22 Апрель, 2006 09:00 

Зарегистрирован: Понедельник, 12 Декабрь, 2005 22:44
Сообщения: 85
Откуда: С.-Петербург
Илья Ермаков писал(а):
Пробовал на NTFS - работает.

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 22 Апрель, 2006 09:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
FAT - это FAT12, на дискетах применяется он и только он.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 24 Апрель, 2006 23:21 

Зарегистрирован: Понедельник, 12 Декабрь, 2005 22:44
Сообщения: 85
Откуда: С.-Петербург
Вызов WinAPI и получение информации о дисках на компьютере:
    GetLogicalDrives()
    GetVolumeInformation(...)
    GetDriveType(..)
    GetCurrentDirectory(..)


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

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


Последний раз редактировалось vladfind Вторник, 25 Апрель, 2006 20:21, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 25 Апрель, 2006 16:29 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
vladfind писал(а):
Вызов WinAPI и получение информации о дисках на Исходный код модуля: http://robot-ivan.narod.ru/blackbox/workfiles.txt (~ 6,7 Кбайт).


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 25 Апрель, 2006 20:28 

Зарегистрирован: Понедельник, 12 Декабрь, 2005 22:44
Сообщения: 85
Откуда: С.-Петербург
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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 25 Апрель, 2006 20:35 

Зарегистрирован: Понедельник, 12 Декабрь, 2005 22:44
Сообщения: 85
Откуда: С.-Петербург
Вопросы для Гуру по файловой системе FAT,VFAT, FAT32, NTFS .

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 25 Апрель, 2006 21:14 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Могу сказать точно, что как в VFAT-FAT32, так и в NTFS, ограничивается не только длина имени файла (256 символов), но и длина пути до файла (если не ошибаюсь - 260 символов. По крайней мере, строковые типы для имен путей обычно объявляются так). Т.е. если мы создаем файл с именем в 256 символов, то мы можем положить его в папку с именем в 4 символа или в 4 вложенных папки с именами из одного символа. Глубже уже нельзя.
Поэтому число вложенных каталогов можно считать ограниченным 260 - и то если они будут однобуквенными. А так - еще меньше.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 26 Апрель, 2006 07:54 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Илья Ермаков писал(а):
Поэтому число вложенных каталогов можно считать ограниченным 260 - и то если они будут однобуквенными.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB