Высокоуровневые методы информатики и программирования Лекция 17 Работа с файловой системой План работы • • • • • • • Основные понятия файловой системы Структура файла Класс Environment Класс DriveInfo Классы Directory и DirectoryInfo Классы File и FileInfo Системы кодирования символов Упрощенная схема работы программы Файлы с данными Файлы с данными Программа пользователь Способ хранения данных Способы хранения данных – В файлах собственной структуры – В файлах базы данных База данных – специальный способ хранения данных, который имеет: – Структуру данных (модели данных) – сетевые, реляционные, объектные; – Специальные программы доступа к данным в базе данных - СУБД; – Универсальный язык общения с реляционными базами данных – SQL. Основные понятия • Устройство – driver: – Физические (жесткие диски, флэш память, CD и т.п.) – Логические – “C:”, “D:”, … . • Папка (каталог) – directory (folder). • Файл – file. Работа с файлами • Файловая система – часть операционной системы обеспечивающая хранение данных на внешних устройствах. • Данные хранятся на внешних устройствах (drives, devices) • Единица хранения – файл (file). • Файл имеет набор атрибутов и содержание (данные) • Файлы содержатся в каталогах (directory), папках (folder). • Каталог может также содержать файлы и другие каталоги (подкаталоги - subdirectory). Схема файловой структуры Структура файла Атрибуты: • File • FileInfo Атрибуты Содержание: • FileStream • StreamReader • StreamWriter • BynaryReader • BynaryWriter Данные Библиотека FCL (Framework Class Library) System.Web Services Description UI HtmlControls Discovery WebControls System.Windows.Forms Form Protocols ComponentModel System.Drawing Caching Security Drawing2D Printing Configuration SessionState Imaging Text System.Data System.Xml ADO SQL XSLT Design SQLTypes XPath Serialization System Collections IO Security Configuration Net ServiceProcess Runtime InteropServices Diagnostics Reflection Text Remoting Globalization Resources Threading Serialization Пространство имен System.IO • Средства файлового ввода-вывода – набор классов, интерфейсов, структур, перечислений и делегатов. • Задачей многих типов пространства System.IO – программная поддержка физических операций с каталогами и файлами. • Содержится в компонентах: – mscorlib.dll (Component Object Runtime Library) – множество базовых типов для решения широкого спектра задач программирования; – System.dll – множество полезных типов, математические вычисления, обработка исключений Классы для работы с файловой системой • Вспомогательные – Environment (System) – DriveInfo (System.IO) • Для работы с директориями – Directory – DirectoryInfo • Для работы с файлами – Для работы с файлами в целом (атрибутами) • File • FileInfo – Для работы с содержанием файлов • FileStream • StreamReader и StreamWriter • BinaryReader и BinaryWriter Статический класс Environment • Свойство – string MachineName { get; } – имя компьютера; – System.OperatingSystem OSVersion { get; } – получение информации об установленной ОС; – string UserName { get; } – имя работающего пользователя; – string CurrentDirectory { get; set; } – определить или задать текущий каталог. • Методы – Получить список названий логических устройств компьютера, например A:\ или C:\ : string[] GetLogicalDrivers() – Посмотреть пути к специальным папкам: string[] GetFolderPath(Environment.SpecialFolder.xxx) Перечисление Environment.SpecialFolder Класс DriveInfo • • Основные элементы класса: Конструктор public DriveInfo(string driveName) • • Статический метод GetLogicalDrives() – возвращает массив объектов типа DriveInfo с возможностью получения дополнительной информации о дисках компьютера. Свойства – – • – – – – Name – строка с названием драйвера; DriveType – тип драйвера (перечисление System.IO.DriveType {CDRom, Fixed, Network, NoRootDirectory, Ram, Removable, Unknown}); RootDirectory – объект класса System.IO.DirectoryInfo; bool IsReady – готовность устройства к работе; long TotalSize – общий размер памяти; long TotalFreeSpace – количество свободной памяти; – string VolumeLabel { get; set; } – текстовая метка драйвера. Пример использования: DriveInfo[ ] myDrives = DriveInfo. GetDrives(); foreach(DriveInfo d in myDrive) { Console.WriteLine(“Имя: {0}”, d.Name); Console.WriteLine(“Тип: {0}”, d.DriveType); } Классы для работы с каталогами (папками) • System.IO.Directory предоставляет статические методы для работы с директориями • System.IO.DirectoryInfo предоставляю возможность создать объект класса для работы с конкретным каталогом. Классы Directory и File Основные члены типа DirectoryInfo • GetDirectories() – получает массив строк, представляющих все подкаталоги текущего каталога. • GetFiles() – получает массив типов FileInfo, представляющих множество файлов данного каталога. • Create() – создает каталог (или множество подкаталогов) в соответствии с заданным именем пути. • Delete() – удаляет каталог и все его содержимое. • MoveTo() – перемещает каталог и его содержимое в место, соответствующее заданному новому пути. • Parent – получить каталог родителя указанного пути. • Root – получить корневую часть пути. Методы классов DirectoryInfo • Конструктор:DirectoryInfo(“путь к каталогу”) Например: DirectoryInfo dir1 = new DirectoryInfo(@“C:\Windows”); DirectoryInfo dir2 = new DirectoryInfo(“.”); • System.IO.DirectoryInfo представляет каталог – GetDirectories([mask]) получить подкаталоги – GetFiles([mask]) получить содержащиеся файлы Пример – работа со списком названий каталогов string[ ] folders; folders = System.IO.Directory.GetDirectories(@"c:\"); for (int i = 0; i < folders.Length; i++) Console.WriteLine(folders[i]); Пример – работа со списком названий файлов using System.IO; ... string[ ] fls; fls = Directory.GetFiles(@"C:\", "p*.*"); for (int i = 0; i < fls.Length; i++) Console.WriteLine(fls[i]); Классы для работы с файлами • System.IO.File предоставляют статические методы для работы с файлами • System.IO.FileInfo предоставляю возможность создать объект класса для работы с файлами – может быть построен заданием пути в конструкторе – Может быть получен из перечисления GetFiles() Методы классов для работы с файлами • System.IO.File предоставляют статические методы для работы с файлами File.Copy(FileName1, FileName2); // копирование файла File.MoveTo(FileName1, FileName2); // перемещение фала File.Delete(FileName1); // удаление файла DateTime dt = File.GetCreationTime(string FileName); • System.IO.FileInfo предоставляю возможность создать объект класса для работы с файлами FileInfo fi = FileInfo(FileName1); // создание объекта fi.Copy(FileName2); // копирование файла fi.MoveTo(FileName2); // перемещение файла fi.Delete(); // удаление файла DateTime dt = fi.GetCreationTime(); // определение даты создания Основные свойства абстрактного базового класса FileSystemInfo • Attributes – получение или задание атрибутов текущего файла, которые представляются перечислением FileAttributes. • CreationTime – получение или задание времени создания текущего файла или директории. • Exists – проверка, существует ли заданный файл или директория. • Extension – получения расширения имени файла • FullName – получение полного пути к файлу или директории • LastAccessTime – получение или задание времени последнего обращения к файлу • LastWriteTime – получение или задание времени последней корректировки файла • Name – получение имени текущего файла или директории. Основные методы класса DirectoryInfo • Create(), CreateSubdirectory() – создание директории (или набора поддиректорий) с заданными именами. • Delete() – удаление директории и всего ее содержания. • GetDirectories() – получение массива строк с названия поддиректорий. • GetFiles() – получение массива экземпляров класса FileInfo, которые соответствуют набору файлов заданной директории. Основные методы класса FileInfo • CopyTo() – копирование существующего файла в новый файл. • MoveTo() – перемещение текущего файла на новое место и с новым именем. • Delete() – удаление файла, с которым выполняется работа. • DirectoryName – получение имени родительской директории. • Length – получение размера текущего файла. • Name – получение имени файла. • Directory – получение экземпляра родительской директории. Системы кодирования символов • ASCII – используется 7 бит; • ANSI – используется 1 байт; • Unicode – используются 2 байта – BigEndianUnicode; – Little-endian architecture. • UTF8 – 1 байт (удаление первого байта в Unicode); • UTF7 – используется семь битов для символа (E-mail). Кодирование символов • • • Первой известной кодировкой символов была кодировка ASCII, и она используется до сих пор. В ASCII-кодировке каждый символ занимает 8 бит, или один байт. Из-за того, что ASCII была предназначена для западных языков, ее использование было ограничено в европейских странах и регионах, чьи языки содержали символы, не включенные в 256 символов, поддерживаемых ASCII. Чтобы обойти это ограничение, Международная организация по стандартизации (ISO International Standards Organization) создала новый стандарт кодировки символов, названный Latin-1, который содержал европейские символы, не вошедшие в набор ASCII. Microsoft расширила Latin-1 и назвала этот стандарт ANSI. Но ANSI по-прежнему осталась 8-битной кодировкой, которая может представлять только 256 уникальных символов. Многие языки имеют тысячи символов, особенно азиатские языки, такие как китайский, корейский и японский. • Для преодоления ограничений стандарта на 8-битную кодировку символов, Microsoft в сотрудничестве с такими компаниями, как Apple Computer, Inc., и IBM, создала некоммерческий консорциум Unicode, Inc., целью которого стало определение нового стандарта на кодировку символов для международных наборов символов. Работа, проделанная в Unicode, была объединена с работой, которая велась в ISO, и результатом стал стандарт Unicode для кодировки символов. • Unicode является 16-разрядным стандартом, что обеспечивает 65 536 уникальных символов - более чем достаточно для представления всех языков мира. Он поддерживает даже архаические языки, такие как санскрит и египетские иероглифы, и включает знаки препинания, математические и графические символы. • Родной кодировкой для OC Windows XP/Vista/7 является Unicode, но она поддерживает и ANSI. Внутри себя операционная система представляет имена объектов, пути и имена файлов в виде 16-битовых символов Unicode. Она также обычно использует Unicode для хранения данных в реестре. American Standard Code for Information Interchange - ASCII • • ASCII изначально предназначался для обмена информацией по телетайпу, в нём, кроме информационных символов, используются символы-команды для управления связью. Это обычный набор спецсигналов, применявшийся и в других до компьютерных средствах обмена сообщениями (азбука Морзе, семафорная азбука), дополненный с учётом специфики устройства. Две таблицы – первая таблица с 0 до 127 – латинский алфавит – вторая таблица с 128 до 255 – национальные алфавиты (для нас - кириллица) • Например: Символ Код $ 36 * 42 A 65 B 66 a 97 b 98 1 49 2 50 ASCII – первая таблица (0-127) 0 1 2 3 4 5 6 7 8 9 0 nul soh stx etx eot enq ack bel bs ht 1 nl vt np cr so si dle dc1 dc2 dc3 2 dc4 nak syn etb can em sub esc fs gs 3 rs us sp ! “ # $ % & ‘ 4 ( ) * + , - . / 0 1 5 2 3 4 5 6 7 8 9 : ; 6 < = > ? @ A B C D E 7 F G H I J K L M N O 8 P Q R S T U V W X Y 9 Z [ \ ] ^ _ ‘ a b C 10 d e f g h i j k l M o p q r s t u v W y z { | } ~ del 11 12 n x ASCII – вторая таблица (128 - 255) .0 .1 .2 .3 .4 .5 .6 8. Ђ 402 Ѓ 403 ‚ 201A ѓ 453 „ 201E … 2026 † 2020 9. ђ 452 ‘ 2018 ’ “ ” • 2019 201C 201D 2022 A0 Ў 40E ў 45E Ј 408 ¤ A4 B. ° B0 ± B1 І 406 і 456 C. А 410 Б 411 В 412 D. Р 420 С 421 E. а 430 F. р 440 A. .7 .8 .9 .A .B .C .D .E .F ‡ € ‰ 2021 20AC 2030 Љ 409 ‹ 2039 Њ 40A Ќ 40C Ћ 40B Џ 40F – 2013 — 2014 ™ 2122 љ 459 › 203A њ 45A ќ 45C ћ 45B џ 45F Ґ 490 ¦ A6 § A7 Ё 401 © A9 Є 404 « AB ¬ AC AD ® AE Ї 407 ґ 491 µ B5 ¶ B6 · B7 ё 451 № 2116 є 454 » BB ј 458 Ѕ 405 ѕ 455 ї 457 Г 413 Д 414 Е 415 Ж 416 З 417 И 418 Й 419 К 41A Л 41B М 41C Н 41D О 41E П 41F Т 422 У 423 Ф 424 Х 425 Ц 426 Ч 427 Ш 428 Щ 429 Ъ 42A Ы 42B Ь 42C Э 42D Ю 42E Я 42F б 431 в 432 г 433 д 434 е 435 ж 436 з 437 и 438 й 439 к 43A л 43B м 43C н 43D о 43E п 43F с 441 т 442 у 443 ф 444 х 445 ц 446 ч 447 ш 448 щ 449 ъ 44A ы 44B ь 44C э 44D ю 44E я 44F Вспомогательный класс Encoding • Класс, описывающий используемую систему кодирования символов • Для создания объектов могут использоваться статические свойства – – – – – Encoding.Unicode Encoding.BigEndianUnicode Encoding.UTF8 Encoding.UTF7 Encoding.ASCII • Позволяет выполнять преобразования между кодировками. Основные методы для работы с текстовыми файлами • Методы класса System.IO.StreamWriter – Write(…) – метод записи строки в файл – WriteLine(…) – метод записи строки в файл и переход к новой строке – NewLine – свойство для задания символов возврата каретки, за которой следует символ окончания строки (\r\n). – void Flush() – метод вывода содержимого буфера на диск; – void Close() – метод закрытия файла. • Методы класса System.IO.StreamReader – string ReadLine() – метод чтения одной строки файла; – string ReadToEnd() – метод чтения всех строк файла до конца; – void Close() – метод закрытия файла. Доля кодировки Unicode в Web-cети • Доля кодировки Unicode в интернет-документах приблизилась к 50 процентам (30.01.2010). Об этом говорится в записи в блоге Google. Для расчетов компания, давно перешедшая на Unicode, использовала данные собственного поискового индекса. • Unicode впервые обогнал все другие кодировки в мае 2008 года. Тогда его доля составляла около 25 процентов, как и доли ASCII- и западноевропейской кодировок. • В 2001 году доля ASCII-кодировки составляла около 55 процентов. Сейчас она снизилась до 20. • Доли других популярных национальных кодировок, в том числе и распространенной в России CP-1251 не превышают десяти, а чаще и пяти процентов. • Многобайтовый стандарт кодирования символов Unicode позволяет использовать символы тысяч национальных алфавитов и представить знаки практически всех письменных языков, в то время как обычные кодировки ограничиваются поддержкой максимум нескольких десятков языков и нескольких алфавитов.