|
Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
(*~\Глагол\Отделы\Обмен~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*) (**) ОТДЕЛ Файл; (*============================================================================* * НАЗНАЧЕНИЕ: работа с файлами * * ОБОЗНАЧЕНИЯ: место - местоположение файла на определенном накопителе * * путь - местоположение файла или относительный путь к файлу * *============================================================================*) ИСПОЛЬЗУЕТ ОС, Цепь ИЗ "..\Иное\"; ПОСТ (* наибольшие длины (с учетом конечного 0X): *) длПути- =ОС.длПутиФ; (* пути к файлу *) длИмени- =ОС.длИмениФ; (* имени файла без типа файла *) длТипа- =ОС.длТипаФ; (* типа файла с начальной "." *) длПолного-=ОС.длПолногоФ; (* полного имени файла *) (* свойства файлов:*) сфОбычный- =ОС.сфОбычный; сфТолькоЧтение- =ОС.сфТолькоЧтение; сфНевидимый- =ОС.сфНевидимый; сфСистемный- =ОС.сфСистемный; сфНазваниеДиска-=ОС.сфНазваниеДиска; сфКаталог- =ОС.сфКаталог; сфАрхивный- =ОС.сфАрхивный; ВИД Поиск-=ОС.ПоискФ; (* системный набор для поиска файлов *) Время-=ОС.ВремяФ; ВПути- =ЦЕПЬ[длПути]; ВИмени- =ЦЕПЬ[длИмени]; ВТипа- =ЦЕПЬ[длТипа]; ВПолного-=ЦЕПЬ[длПолного]; (******************************************************************************) ЗАДАЧА ИсправитьИмя(имя+:ЦЕПЬ); (* Исправляет "/" на "\" и убирает повторы "\". *) ПЕР ч,п,дл:ЦЕЛ; зн,зн1:ЗНАК; УКАЗ дл:=ДЛИНА(имя); ч:=0; п:=0; зн1:=0X; ПОКА ч < дл ВЫП зн:=имя[ч]; УВЕЛИЧИТЬ(ч); ЕСЛИ зн = "/" ТО зн:="\" КОН; ЕСЛИ (зн # "\") ИЛИ (зн1 # "\") ТО имя[п]:=зн; УВЕЛИЧИТЬ(п) КОН; зн1:=зн КОН; ЕСЛИ п < дл ТО имя[п]:=0X КОН КОН ИсправитьИмя; (******************************************************************************) ЗАДАЧА ИсправитьМесто(имя+:ЦЕПЬ); (* Убирает по возможности ".." в местоположении файла. *) ПЕР ч,п,послпалка,начпоз,дл:ЦЕЛ; зв,зн:ЗНАК; точек:ЦЕЛ; ЗАДАЧА ЧП(); (* Читаем и Пишем (вперёд) *) УКАЗ ЕСЛИ ч < дл ТО зв:=имя[ч]; имя[п]:=зв; УВЕЛИЧИТЬ(ч); УВЕЛИЧИТЬ(п) ИНАЧЕ зв:=0X КОН КОН ЧП; ЗАДАЧА Чвперёд(); (* Читаем вперёд *) УКАЗ ЕСЛИ ч < дл ТО зв:=имя[ч]; УВЕЛИЧИТЬ(ч) ИНАЧЕ зв:=0X КОН КОН Чвперёд; ЗАДАЧА Чназад(); (* Читаем назад *) УКАЗ ЕСЛИ п > начпоз ТО УМЕНЬШИТЬ(п); зн:=имя[п] ИНАЧЕ зн:=0X КОН КОН Чназад; УКАЗ ИсправитьИмя(имя); дл:=ДЛИНА(имя); (* не рассматриваем накопитель *) начпоз:=Цепь.ПозицияЗнака(":",имя,0)+1; ч:=начпоз; п:=начпоз; ЧП(); ПОКА ч < дл ВЫП ЕСЛИ зв = "." ТО (* считаем точки *) точек:=0; ПОКА зв = "." ВЫП УВЕЛИЧИТЬ(точек); ЧП() КОН; (* откатываем палки *) послпалка:=п; Чназад(); ПОКА (п > начпоз) И (точек > 0) ВЫП Чназад(); ЕСЛИ зн = "\" ТО послпалка:=п+1; УМЕНЬШИТЬ(точек) КОН КОН; п:=послпалка; (* пропуск лишних имён *) ПОКА (ч < дл) И (зв # "\") ВЫП Чвперёд() КОН АЕСЛИ зв = "\" ТО ЧП() ИНАЧЕ (* пропуск имён *) ПОКА (ч < дл) И (зв # "\") ВЫП ЧП() КОН КОН КОН; (* отсекаем лишнее *) ЕСЛИ п < дл ТО имя[п]:=0X КОН КОН ИсправитьМесто; (******************************************************************************) ЗАДАЧА НайтиМесто-(отместа-,путь-,место+:ЦЕПЬ); (* Находит местоположение файла <место>, зная путь <путь> из точки <отместа>. *) УКАЗ ЕСЛИ Цепь.ПозицияЗнака(":",путь,0) # -1 ТО (* путь - местоположение *) СПИСАТЬ(путь,место) ИНАЧЕ СПИСАТЬ(отместа,место); ЕСЛИ место # "" ТО ЕСЛИ место[ДЛИНА(место)-1] # "\" ТО Цепь.ДобавитьЗнак(место,"\") КОН; ЕСЛИ (путь # "") И ((путь[0]="\") ИЛИ (путь[0]="/")) ТО (* путь - корневой *) (* оставляем у старого места только накопитель *) место[Цепь.ПозицияЗнака(":",место,0)+1]:=0X КОН КОН; Цепь.Добавить(место,путь) КОН; ИсправитьМесто(место) КОН НайтиМесто; (******************************************************************************) ЗАДАЧА РазобратьИмя-(пимя-,путь+,имя+,тип+:ЦЕПЬ); (* Переписывает из цепочки с полным именем файла <пимя> в <путь> путь к файлу, * в <имя> имя файла без его типа, в <тип> тип файла. *) ПЕР пам:ВПолного; поз:ЦЕЛ; естьпуть,естьтип:КЛЮЧ; (* Возвращает ВКЛ, если текущая "." определяет путь, а не тип файла. *) ЗАДАЧА ТочечныйПуть(поз:ЦЕЛ):КЛЮЧ; УКАЗ УМЕНЬШИТЬ(поз); ЕСЛИ (поз < 0) ИЛИ (пам[поз] = "\") ИЛИ (пам[поз] = ":") ИЛИ (пам[поз] = ".") ТО ВОЗВРАТ ВКЛ КОН; ВОЗВРАТ ОТКЛ КОН ТочечныйПуть; УКАЗ СПИСАТЬ(пимя,пам); ИсправитьИмя(пам); путь[0]:=0X; имя[0]:=0X; тип[0]:=0X; естьпуть:=ОТКЛ; естьтип:=ОТКЛ; поз:=ДЛИНА(пам); ПОКА поз > 0 ВЫП УМЕНЬШИТЬ(поз); ЕСЛИ пам[поз] = "." ТО ЕСЛИ НЕ естьпуть И (пам[поз+1] = 0X) ТО естьпуть:=ТочечныйПуть(поз) КОН; ЕСЛИ НЕ естьпуть И НЕ естьтип ТО естьтип:=ВКЛ; Цепь.Часть(пам,тип,поз,длТипа-1); пам[поз]:=0X КОН АЕСЛИ (пам[поз] = "\") И НЕ естьпуть ТО естьпуть:=ВКЛ; Цепь.Часть(пам,имя,поз+1,длИмени-1); пам[поз+1]:=0X КОН КОН; ЕСЛИ естьпуть ТО Цепь.Часть(пам,путь,0,длПути-1) ИНАЧЕ Цепь.Часть(пам,имя,0,длИмени-1) КОН КОН РазобратьИмя; (******************************************************************************) ЗАДАЧА СобратьИмя-(пимя+,путь-,имя-,тип-:ЦЕПЬ); (* Собирает полное имя файла <пимя> из пути к файлу <путь>, * имени файла без его типа <имя> и типа файла <тип>. *) УКАЗ СПИСАТЬ(путь,пимя); ЕСЛИ пимя # "" ТО ИсправитьИмя(пимя); ЕСЛИ пимя[ДЛИНА(пимя)-1] # "\" ТО Цепь.ДобавитьЗнак(пимя,"\") КОН КОН; Цепь.Добавить(пимя,имя); ЕСЛИ тип # "" ТО ЕСЛИ тип[0] # "." ТО Цепь.ДобавитьЗнак(пимя,".") КОН; Цепь.Добавить(пимя,тип) КОН КОН СобратьИмя; (******************************************************************************) ЗАДАЧА ПутьИзПолного-(пимя-,путь+:ЦЕПЬ); (* Переписывает из цепочки с полным именем файла <пимя> в цепочку <путь> * путь к файлу (включая УКАЗание диска и "\" перед именем файла). *) ПЕР пам:ВПолного; УКАЗ РазобратьИмя(пимя,путь,пам,пам) КОН ПутьИзПолного; (******************************************************************************) ЗАДАЧА ИмяИзПолного-(пимя-,имя+:ЦЕПЬ); (* Переписывает из цепочки с полным именем файла <пимя> в цепочку <имя> * имя файла. *) ПЕР пам:ВПолного; УКАЗ РазобратьИмя(пимя,пам,имя,пам) КОН ИмяИзПолного; (******************************************************************************) ЗАДАЧА ИмяТипИзПолного-(пимя-,имятип+:ЦЕПЬ); (* Переписывает из цепочки с полным именем файла <пимя> в цепочку <имятип> * имя и тип (расширение) файла. *) ПЕР пам:ВПолного; имя:ВИмени; тип:ВТипа; УКАЗ РазобратьИмя(пимя,пам,имя,тип); СПИСАТЬ(имя,имятип); Цепь.Добавить(имятип,тип) КОН ИмяТипИзПолного; (******************************************************************************) ЗАДАЧА ТипИзПолного-(пимя-,тип+:ЦЕПЬ); (* Переписывает из цепочки с полным именем файла <пимя> в цепочку <тип> * тип (расширение) файла. *) ПЕР пам:ВПолного; УКАЗ РазобратьИмя(пимя,пам,пам,тип) КОН ТипИзПолного; (******************************************************************************) ЗАДАЧА ИзменитьТип-(пимя+,тип-:ЦЕПЬ); (* Изменяет тип (расширение) в полном имени файла <пимя> на <тип>. *) ПЕР путь:ВПути; имя:ВИмени; старыйтип:ВТипа; УКАЗ РазобратьИмя(пимя,путь,имя,старыйтип); СобратьИмя(пимя,путь,имя,тип) КОН ИзменитьТип; (******************************************************************************) ЗАДАЧА Существует-(имя-:ЦЕПЬ):КЛЮЧ; (* Возвращает ВКЛ, если существует файл с именем <имя>. *) ПЕР поиск:Поиск; УКАЗ ЕСЛИ ОС.ПервыйПоискФ(имя,поиск) ТО ОС.ОкончитьПоискФ(поиск); ВОЗВРАТ ВКЛ КОН; ВОЗВРАТ ОТКЛ КОН Существует; (******************************************************************************) ЗАДАЧА ВремяИзменения-(имя-:ЦЕПЬ; время+:Время); (* Возвращает <время> изменения файла <имя> или -1. *) ПЕР поиск:Поиск; УКАЗ ЕСЛИ НЕ ОС.ПервыйПоискФ(имя,поиск) ТО время:=-1; ВОЗВРАТ КОН; время:=поиск.времяПослЗаписи; ОС.ОкончитьПоискФ(поиск) КОН ВремяИзменения; (******************************************************************************) ЗАДАЧА Размер-(имя-:ЦЕПЬ):ЦЕЛ; (* Возвращает размер файла <имя> или -1. *) ПЕР поиск:Поиск; размер:ЦЕЛ; УКАЗ ЕСЛИ НЕ ОС.ПервыйПоискФ(имя,поиск) ТО ВОЗВРАТ -1 КОН; размер:=поиск.размерМладш; ОС.ОкончитьПоискФ(поиск); ВОЗВРАТ размер КОН Размер; (******************************************************************************) ЗАДАЧА Найти-(имя-,тип-,пути-,пимя+:ЦЕПЬ):КЛЮЧ; (* Ищет файл с именем <имя> и типом <тип> в списке путей нахождения файла * <пути>. Пути нахождения файла перечислены в цепочке <пути> через точку * с запятой. Если файл найден, то в цепочку <пимя> задача записывает полный * путь к этому файлу и возвращает ВКЛ, в противном случае возвращает ОТКЛ. *) ПЕР путь:ВПути; начп,конп,длпутей:ЦЕЛ; УКАЗ длпутей:=ДЛИНА(пути); начп:=0; ПОВТОРЯТЬ конп:=Цепь.ПозицияЗнака(";",пути,начп); ЕСЛИ конп < 0 ТО конп:=длпутей КОН; Цепь.Часть(пути,путь,начп,конп-начп); СобратьИмя(пимя,путь,имя,тип); ЕСЛИ Существует(пимя) ТО ВОЗВРАТ ВКЛ КОН; начп:=конп+1 ДО начп >= длпутей; ВОЗВРАТ ОТКЛ КОН Найти; КОН Файл. |
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com
|
|