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 Кбайт] ТЕСТ:
Помогите проверить на других файловых системах(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 и получение информации о дисках на компьютере:
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
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 подкаталогов. Тогда длина символьного массива для возврата текущего каталога:
|
Автор: | Илья Ермаков [ Вторник, 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/ |