""

\chapter{Понятие файла и файловой системы}
\section{Несколько общих слов}
Традиционно книги о компьютерах начинаются с того, что в компьютере
есть операционная система. (иногда говорят о системных программах).

По-моему, большинству пользователей задумываться об этом не обязательно.
Это для разработчика важно различие между системной и прикладной 
программой, поскольку от этого зависят возможности, которыми он
располагает и возможные последствия его ошибок.

С точки зрения пользователя, любая программа в компьютере предназначена
для того, чтобы помочь ему решить какие-то из его задач, а все они вместе
представляют собой единую среду, в которой ему и предстоит работать.

Если вам все-таки интересно, какие из имеющихся у вас программ прикладные,
а какие системные, попробуйте оценить задачи, которые они решают.

Если эти задачи заключаются в обеспечении работоспособности 
компьютера, или в организации информации, хранящейся в нем, то
это скорее всего {\it системная программа}.

Если же речь идет о подготовке текстов, конкретных рассчетах или
работе с картами, то программа скорее всего {\it прикладная}

Самое же важное, что следует запомнить, это то, что работая с 
компьютером {\bf вы всегда имеете дело с какой-либо программой},
поскольку без выполняющейся программы компьютер так же мертв,
как тело без души. 

\section{Память и диск - в чем разница}

Одно из самых распространенных заблуждений начитающих пользователей~---
это отсутствие понимания разницы между памятью компьютера (оперативной)
и дисковым пространством.

Немалую роль в создании этой путаницы сыграла неустоявшаяся терминология,
когда диски называют <<устройствами долговременной памяти>> или
<<внешней памятью>>. 

В принципе это верно, поскольку диски, как и память, предназначены
для хранения информации, и в чем-то даже более верно, поскольку
информация на диске хранится если не неограничено, то по крайней мере
годами, а то что хранится в памяти <<забывается>> при каждом
выключении компьютера.

Но, поскольку другого слова для обозначения оперативной памяти нет,
то условимся называть <<памятью>> только оперативную память компьютера,
а диски - <<дисковым пространством>>.

Итак, в чем разница между памятью и диском?
\begin{enumerate}
\item Работа с памятью в десятки раз быстрее чем с диском, поэтому 
для того, чтобы обработать какую-то информацию, компьютер 
всегда сначала загружает ее с диска в память, обрабатывает в памяти
и потом записывает обратно на диск.
\item Дисковое пространство обычно обычно по объему в десятки раз
больше чем память. Поэтому при обработке больших объемов данных 
приходится загружать их по частям, обрабатывать и результаты обработки
записывать опять же по частям.
\item Память хранит информацию только до тех пор пока на нее подается
питание. Поэтому, если ваша программа не сохраняет результаты работы
сама, как поступают некоторые базы данных (см. главу \ref{Databases})
то не забывайте периодически <<сохранять>> результаты своей работы диск.
Мало ли что может случиться с электропитанием.
\end{enumerate}

\section[Файл]{Файл~--- основная единица хранения информации}

Один из самых ключевых терминов при работе с компьютером~---
термин {\it файл}.

Что это такое? Это всего-лишь любая порция информации, которая
хранится в компьютере и имеет имя, по которому ее можно там
найти.

В виде файлов хранятся и программы, и тексты, и картинки.

В некоторых операционных системах понятие <<файл>> стараются не использовать,
заменяя его на понятие <<документ>>.

В этом есть определенный смысл. Посмотрим на те объекты, с которыми
нам приходится иметь дело при работе без компьютера.

Рукопись статьи это документ?~--- Несомненно.\\
Топографическая карта?~--- Документ.\\
Полевой дневник?~--- Тоже.\\
Геологический профиль?~--- Какие могут быть вопросы?
Справочник или монография?~--- С некоторой натяжкой да.

В общем, слова файл и документ можно было бы считать синонимами,
если бы в виде файлов не хранились программы и всяческая служебная
информация, необходимая им в процессе работы.

Те операционные системы, которые оперируют понятием <<документ>> норовят
скрыть эту внутреннюю кухню от пользователя. На мой взгляд это скорее
мешает, чем помогает. 
 
Итак, файл это порция информации, которая имеет имя. Какими свойствами
кроме имени обладает файл?
\begin{description}
\item[Размер.] Информация о размере редко помогает при поиске нужного
файла, но если у вас не хватает места на диске или вы хотите перенести
файл на другой компьютер на дискете, размер его становится жизненно важным.

\item[Тип файла.] В файле может храниться самая разная информация, и хорошо
 бы иметь способ узнать, какая именно, прежде чем мы начнем работать
 с этим файлом, потому что, например, попытка загрузить графический файл
 в текстовый редактор ни к чему хорошему обычно не приводит\footnote{Из этого
правила есть забавные исключения, о которых мы поговорим в главе \ref{Linux}}.
 
 В MacOS принцип типизации файла проводится очень строго. Там с каждым
 файлом связывается четырехбуквенный код, который помогает системе определить,
 какую программу запускать, если пользователь захотел посмотреть какой-то
 файл.

 Такая строгость не всегда хороша. Зачастую один и тот же файл удобно
 последовательно обрабатывать несколькими программами. Например, 
 файл с фотографией мы сначала создаем в программе, управляющей сканнером,
 потом редактируем в каком-нибудь графическом редакторе, а потом
 включаем в документ в текстовом процессоре или, если это аэрофотоснимок,
 с помощью геоинформационной системы привязываем к карте.

 Поэтому в других операционных системах типизация файлов менее строгая.
 В MS-DOS и системах выросших из нее (Windows, OS/2) имя файла состоит
 из собственно имени и трехбуквенного {\it расширения} которое обычно
 и используется для обозначения типа. 
 
 Расширение~--- это просто часть имени, и его всегда можно изменить
 командой ``Переименовать файл''. Но многие программы, и в частности
 сама ОС, когда она смотрит, является файл программой или нет,
 обращают внимание именно на расширение.

 В Unix типы файлов обрабатываются несколько гибче. Там тоже есть
 соглашения о расширениях, которые как и в DOS, отделяются от имени файла
 точкой, но нет никаких ограничений на то, сколько символов должно быть
 в расширении, и сколько расширений может быть у файла.

 Например, очень часто к имени файла, который имел уже какое-то расширение,
 программа gzip (упаковщик файлов) прибавляет свое расширение {\tt .gz}.
 В результате, увидев файл с расширением {\tt .tar.gz} вы можете сразу
 сказать, что это архив созданный tar, который затем был упакован gzip.

 С другой стороны слабая типизация имеет свои недостатки. Никто не обязывает
 неаккуратного пользователя правильно именовать свои файлы, и другому
 человеку бывает сложно разобраться, а что там внутри.

 В Unix есть команда file, которая пытается определить тип файла, анализируя
 его содержимое. Но и она не всесильна.
\item[Дата создания.](Точнее дата последнего изменения). Очень полезная
информация. Позволяет определить, например, какая из версий вашего текста
самая свежая, не заглядывая в сам текст. Для того, чтобы этой информацией
можно было пользоваться, встроенные часы вашего компьютера должны быть
правильно выставлены. А то будут у вас все файлы от 1 января 1980 года,
как зачастую бывало на старых XT, где не было энергонезвисимого таймера,
а пользователи ленились выставлять время при каждой перезагрузке.
\item[Дата последнего доступа.] Эта информация хранится далеко не
всеми операционными системами. Из упоминаемых в этой книге
дату последнего доступа хранит, по-моему, только Unix.
\item[Атрибуты файлов.] Информация, которую разные системы прячут
в атрибуты файлов, различается. Например DOS имеет атрибут <<скрытый>>
который указывает, что файл не нужно показывать при просмотре списка
файлов, а в Unix скрытым файл делается с помощью специальной структуры
имени. В то же время в Unix в атрибутах указывается, является ли файл
исполняемой программой, а DOS определяет это по расширению.
\item[Владелец.] Многопользовательские системы, например Unix или
Windows NT, обычно связывают с файлом информацию о том, кому он 
принадлежит. Это удобно не только когда надо узнать, кто забил
диск всяким мусором, но и с точки зрения защиты файла от
случайного стирания или модификации. Можно установить права
доступа к своему файлу так, что другие пользователи смогут
его просматривать (или выполнять, если это программа), но не смогут
стереть или изменить.
\end{description} 
  

\section{Иерархическая структура каталогов}
\label{FileHierarchy}
На диске современного компьютера обычно хранится несколько тысяч
файлов. Представьте себе, что было бы, если бы вам каждый раз
приходилось искать нужный файл во всей этой куче.

Это все равно, что представить себе книгохранилище библиотеки в виде
большого зала, доверху забитого стопками книг.

Но в библиотеке книги хранят в шкафах, внутри которых есть полки,
а на одной полке обычно достаточно мало книг, чтобы их можно было
охватить взглядом.

Точно так же устроено хранение информации на диске компьютера.
Только роль книг играют файлы, а <<полки>> и <<шкафы>> называются
каталогами (англ. {\it directory})

Особенностью каталогов является то, что они могут быть неограничено
вложены друг в друга. Представьте себе большую коробку с документами,
внутри которой документы расположены в коробках поменьше, а в некоторых
их этих коробках~--- еще меньшие коробки, и так далее до тех пор
пока это не перестанет быть удобным.

Вообще говоря, во всех системах существует ограничение на глубину
вложенности каталогов, но вряд ли вам удастся его достичь, если
вы не зададитесь этой целью специально.

Иногда систему каталогов на диске представляют в виде дерева,
корнем которого является самый главный каталог, содержащий все остальные
(он так и называется~--- корневой каталог), ветвями~--- каталоги,
а листьями~--- файлы. 

В отличие от многих настоящих деревьев, листья на этом дереве могут
расти на ветках любой <<толщины>>, и даже прямо из корня.

Путь от корня до конкретного <<листа>> называется полным именем файла.
По английски его так и называют <<путевое имя>> (pathname).

Выглядит оно как последовательность имен каталогов, разделенных
специальным знаком, с именем файла в конце. Специальные знаки,
применяемые для разделения каталогов в разных системах разные.

Наиболее распротраненные это дробная черта <</>> (Unux) и обратная
черта <<$\backslash$>> (DOS, Windows, OS/2).

Кстати, для совместимости с UNIX многие программы под DOS правильно
понимают дробную черту в именах файлов.

Конечено, указывать длинный список каталогов каждый раз, когда
вам понадобился какой-то файл еще более неудобно, чем
разбираться в списке из нескольких тысяч файлов.

Поэтому существует понятие {\it текущего каталога}


Если имя файла начинается с дробной черты, то это <<абсолютное имя>>,
отсчитываемое от  корневого каталога, а если оно начинается с
чего-то другого, то это <<относительное имя>>, отсчитываемое от текущего
каталога.  

Если при этом надо сослаться на каталог уровнем выше (содержащий
текущий), то для него используется специальное имя <<{\tt ..}>>.
Можно ссылаться на текущий каталог как на <<.>>, а на файл в текущем
каталоге как на {\tt ./filename} вместо просто {\tt filename}, 
но делать это приходится в очень редких случаях.

Может возникнуть вопрос такой вопрос: <<Каталог все-таки называется
каталогом, а не шкафом. А в библиотеке одна и та же книга может
быть упомянута в разных каталогах (например по имени автора,
в систематическом и в региональном). Бывает ли такое с файлами?>>

Пару лет назад, когда основной операционной системой была DOS, я ответил
бы <<нет>>, но практически для всех остальных систем правильный ответ
<<да>>. Вы можете поместить в каталог ссылку (link, в Unix) или
псевдоним (alias  MacOS, shortcut Windows-95) для файла, расположенного 
в другом
каталоге. С точки зрения любой программы эта ссылка ничем не отличается
от самого файла~--- с ее помощью можно этот файл читать или редактировать.



\section[Операционная система]{Операционная система как набор средств структурирования
         информации}
Первая программа, которая запускается при включении питания
компьютера, называется {\it операционная система}.

Основная ее задача~--- обеспечить для других программ возможность
выполняться. В эту задачу входит:
\begin{itemize}
\item Поддержка файловой системы, поскольку все остальные программы
записаны в виде файлов.
\item Стандартизация работы с различными устройствами, например
с разными типами мониторов и дисководов.
\item Организация взаимодействия программ между собой и 
 разделение ресурсов между ними.
\end{itemize}

Все распространенные сейчас операционные системы эту задачу
так или иначе решают.

Поэтому основное, что пользователю надо о них знать~--- это
те способы структурирования информации (см. раздел \ref{FileHierarchy})
и взаимодействия задач, которые они обеспечивают, и тот стиль 
взаимодействия с пользователем который они предлагают работающим в них
программам.

Одним из важнейших критериев для выбора операционной системы является
<<дружественность к пользователю>>. По-моему под этим стоит понимать
не привлекательность картинки на экране (это больше похоже на приманку
в мышеловке), а реальное удобство работы, которое в первую очередь
определяется тем, насколько вы можете переложить на компьютер решение
тех рутинных задач, которые у вас возникают каждый день.

Довольно трудно представить себе область деятельности, для которой
была бы написана программа с готовыми позициями меню на все случаи
жизни. Во всяком случае, для занятий наукой такой программы нет.
Поэтому операционная система тем удобнее для пользователя, чем легче
в ней последовательность из трех-пяти команд превратить в одну.


Сейчас вы можете столкнуться со следующими операционными системами:
\begin{description}
\item [MS-DOS:] - самая старая и распространенная операционная система
  на IBM-совместимых персональных компьютерах. Не поддерживает
  многозадачности и не заботится о работе с нестандартной аппаратурой,
  например со звуковой картой и даже графикой, предоставляя программам
  делать это самим. Благодаря этому разработчики игр могут под DOS
  добиться много большего, чем под другой операционной системой.
  MS-DOS изначально была расчитана на то, что пользователь набирает
  команды на клавиатуре, словами. Хотя сейчас этим почти никто не
  пользуется~--- все отгораживаются от командной строки DOS различными
  оболочками типа Norton Commander, принципиально мощность встроенного
  языка DOS намного превосходит те возможности, которые предоставляются
  более мощными системами вроде Windows или MacOS.

  Кроме того, на слабых машинах DOS часто предпочтительнее других
  операционных систем, поскольку почти не потребляет ресурсов
  компьютера (памяти и процессорного времени) для собственных нужд,
  предоставляя почти все прикладным программам.
\item [Windows:] - надстройка над DOS, стандартизирующая работу
  с графикой и позволяющая запускать несколько программ одновременно.
  (в большинстве случаев это не значит, что они будут выполняться
   параллельно. Скорее всего все программы кроме той, с которой вы
   работаете сейчас, будут остановлены). Большая часть IBM совместимых
   компьютеров имеют сейчас Windows и большая часть современных прикладных
  программ написана в расчете на Windows. 
 
  Слабым местом Windows является то, что она не расчитана на продвинутых
  пользователей. Фактически ваши возможности ограничены тем набором
  иконок, который имеется на экране. Попытка автоматизировать какую-то
  часто встречающуюся задачу с помощью прилагающегося к Windows
  Macro Recorder как правило не приводит к успеху.
 
  К счастью распространенные программы для Windows компенсируют этот
  пробел, предлагая мощные встренные макроязыки. Поэтому если вашу
  задачу можно от начала до конца решить средствами Winword или Excel,
  для вас не все потеряно~--- вы можете добиться того, что она будет
  выполняться нажатием на одну кнопку.

  Если же нет, то вам придется раздобыть какую-нибудь программу
  стороннего разработчика, например Take Command фирмы JPSoft, для
  того чтобы ваш компьютер мог хоть немного <<думать сам>>

\item [Windows-95:] - шумно разрекламированный преемник Windows+DOS.
  Снимает ряд ограничений DOS и Windows, в частности то, что имя файла
  имеет не более 8 символов в длину. На взгляд автора, возросшие требования
  системы к мощности компьютера не окупаются этими новыми возможностями.

  Все что касается отсутствия возможностей автоматизации часто выполняемых
  задач, применимо к Windows 95 еще в большей степени, чем к Windows.
\item [Windows-NT:] - <<профессиональная>> версия Windows. Отличается
 громандными требованиями к ресурсам компьютера, но в отличие от
 Windows является действительно многопользовательской и многозадачной
 системой. Бывает не только на IBM-совместимых компьютерах, но и на
 рабочих станциях.

 Как система профессиональная, NT имеет свой собственный язык командных
 файлов, который по отзывам несколько мощнее, чем в DOS. Кроме того,
 в Internet можно найти версии Unix-shell для NT.
\item [OS/2:] - основной конкурент Windows, разрабатываемый фирмой
  IBM. Система несколько менее требовательная к ресурсам и несколько
  более многозадачная, чем Windows. Используется значительно реже, чем
  разнообразные Windows, и поэтому для нее разработано меньше программ.


  Включает в себя мощный язык сценариев REXX, но он настолько сложен,
  что надо быть профессиональным программистом, чтобы им эффективно
  пользоваться.
\item [MacOS:] - операционная система на компьютерах Macintosh. По 
  своим свойствам очень похожа на Windows (точнее, Windows на нее).
  Поскольку у нас в стране Маки практически отсутствуют, мы останавливаться
  на ней почти не будем.

  По утверждению дилеров фирмы Apple, в состав MacOs входит язык 
  AppleScript, но на том Макинтоше, с которым пришлось иметь дело
  автору, он не был установлен, поэтому об удобстве автоматизации
  часто выполняемых задач на Маке я ничего сказать не могу.
\item [Unix:] - Наиболее древняя из всех перечисленных систем. 
  До сих пор остается основной системой на всех платформах мощнее IBM PC,
  хотя в последнее время несколько потеснена Windows NT. Многие
  концепции, которые были позднее заимствованы другими системами,
  например иерархическая структура каталогов, впервые возникли именно
  в Unix. 
 
 Существует много различных клонов Unix, которым фирмы
  изготовители придумывают новые названия, поскольку само слово Unix
  является зарегистрированной торговой маркой. Например Solaris, SunOS,
  IBM~AIX, HP-UX, IRIX - это все различные версии Unix. 

С появлением
  386 процессора до Unix доросли и IBM-совместимые персональные компьютеры.
Наиболее распространены следующие версии UNIX для IBM PC:
\begin{itemize}
\item SCO Unix
\item NetBSD и FreeBSD
\item Solaris for Intel
\item Linux
\end{itemize}

  В Unix наиболее развиты и удобны мелкие средства упрощения себе жизни,
  такие как сценарии часто выполняемых операций. Единственным недостатком
  является их чрезмерное разнообразие. В результате пользователь Unix
  как лиса из русской сказки, постоянно оказывается перед трудным выбором:
  какой уловкой из множества имеющихся в его распоряжении воспользоваться.
  
  В главе \ref{Linux} мы постараемся остановиться на этом вопросе более
  подробно.
\item[Различные <<динозвары>>] 
Если вы будете работать в крупных зарубежных орагнизациях, где еще 
сохранились компьютеры класса mainframe или рабочие станции первого
поколения, вам могут встретиться и другие, ныне <<вымершие>> ОС - VM/360,
VMS и другие. Специально останавливаться на них не имеет смысла,
но если вы умеете обращаться с командами Unix и DOS, вы, наверное
справитесь и с ними.
\end{description}
\section[Точка зрения программиста]{Другая точка зрения на ОС - точка зрения программиста.}
Для программиста ОС~--- это прежде всего набор средств, которые она
ему предоставляет, для того чтобы решить конкретную задачу.

Наиболее важным является то минимальное количество средств, которое 
надо уметь применять, чтобы решить простейшую задачу.

Почему? Я полагаю, что никто из читателей никогда в жизни не соберется
писать что-то типа Winword. А вот необходимость написать программку,
которая реализует какой-то метод расчетов скорее всего в процессе
работы у вас возникнет. И от того, насколько просто будет это сделать,
зависит то, сколько сил, времени и денег вам придется потратить,
чтобы написать ее самому или найти программиста, который сделает
это за вас.

В Unix переход от набора команд на клавиатуре к программированию
настолько прост и естественнен, что вы его даже не заметите.

В DOS это несколько сложнее~--- вам скорее всего не хватит тех средств,
которые предоставляет сама DOS, и потребуется какое-то дополнительное
программное обеспечение. Но почти наверняка те программы, которые
вы используете в повседневной работе~--- электронные таблицы или
системы управления базами данных, содержат все необходимые средства.

Если же вам их не хватит, то найти програмиста, способного написать
программу под DOS сейчас довольно просто.

Намного сложнее в Windows или MacOS. Эти системы специально задумывались
таким образом, чтобы сделать программирование уделом исключительно
профессионалов. Даже и профессиональному программисту требуется
несколько месяцев, чтобы освоить минимум концепций и функций 
Windows, необходимый для написания простейшей программы.

Даже широко разрекламированные <<системы визуального программирования>>,
такие как Visual Basic и Delphi, этой проблемы не решают, поскольку
то что понадобится вам, скорее всего представляет собой реализацию
каких-то математических методов со сложной графикой или даже картографией,
а в визуальных средах удобно писать программы, ориентированные на
бизнес.

Еще одна особенность Unix по сравнению с другими системами~---
большая часть программ доступна в исходных текстах, то есть
увидев в какой-нибудь программе понравившуюся вам возможность,
можно посмотреть как она сделана, и даже позаимствовать ее оттуда.

В Windows и Dos программы обычно поставляются в двоичном виде,
и вы не имеете возможности не только позаимствовать понравившиеся
идеи (что обычно явным образом запрещено лицензионным соглашением),
но и исправить очевидную ошибку.

Короче с точки зрения программиста под DOS и Windows чужая программа,
это то же самое, что для инженера~--- продукция конкурирующей фирмы.
Можно посмотреть и пощупать, можно постараться сделать не хуже или
даже лучше, а узнать как работает~--- извините, коммерческая тайна.

В Unix чужая программа больше похожа на книгу. Можно не только с 
удовольствием читать (пользоваться), но и влезть в <<кухню>> автора,
позаимствовать некоторые идеи, до тех пор пока это не становится
явным плагиатом. Благо либо в документации, либо в начале самого
текста обычно написано, что автор разрешает вам с его программой
делать.

\section[Различия между ОС]{Различия между файловыми системами разных OC}   
Начав рассказ о файлах и файловых системах, мы все время отвлекаемся
на программы и операционные системы. 

Это естественно, ведь с точки зрения пользователя файлы данных неотделимы
от программ, которые с ними работают.

Но вернемся к нашим баранам. Рассмотрим особенности файловых систем
в разных OS.


Все, что раньше говорилось о файловой системе вообще, относится
в первую очередь к файловой системе Unix.

В файловой системе DOS и Windows 3.1 есть два существенных ограничения:

\begin{enumerate}
\item длина имени файла ограничена восемью буквами (не считая расширения);
\item не бывает ссылок и псевдонимов, поэтому каждый файл может
     жить только в одном каталоге.
\end{enumerate}
В Windows 95 и OS/2 этих ограничений нет.

Кроме того, при работе с DOS и Windows крайне не рекомендуется использовать
в именах файлов пробелы, знаки препинания и прочие нестандартные символы
(включая русские буквы). Если вам уж очень нужно сделать имя файла состоящим
из двух слов, использйте дефис или подчерк <<\verb!_!>>.

Кроме того, в DOS, Windows и OS/2 большие и маленькие буквы в именах файлов 
считаются
одинаковыми\footnote{ Кстати, именно в этом причина того, что не стоит
использовать в именах русские буквы. Если система была плохо настроена,
то она не сможет сделать из маленьких русских букв заглавные, а это
может привести к неприятностям}, что еще сужает диапазон возможных имен.

