Опубликован: 05.08.2010 | Доступ: свободный | Студентов: 2009 / 47 | Оценка: 4.50 / 4.40 | Длительность: 60:26:00
Лекция 5:

Работа с файлами и каталогами

Классы DirectoryInfo и FileInfo

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

Классы DirectoryInfo и FileInfo имеют общего родителя - абстрактный класс FileSystemInfo, который наделяет их базовым набором методов и свойств. Некоторые из этих членов приведены в таблице.

Таблица 18.4. Некоторые члены базового класса FileSystemInfo
Член Описание
Attributes Свойство позволяет извлекать и устанавливать атрибуты для файла или каталога, используя комбинацию значений перечисления FileAttributes:
  • Archive - элемент помечен как архивный
  • Compressed - элемент сжат. Разрешено читать, но устанавливается только через механизмы ОС
  • Device - атрибут зарезервирован и пока не используется
  • Directory - элемент является каталогом
  • Encrypted - элемент зашифрован . Для файла это значит, что все данные в нем зашифрованы. Для каталога это означает, что режим шифрования включен по умолчанию для вновь. создаваемых файлов и подкаталогов. Разрешено читать, но устанавливается только через механизмы ОС
  • Hidden - элемент скрыт
  • Normal - элемент без атрибутов. Этот атрибут устанавливается по умолчанию, когда сняты все другие атрибуты
  • NotContentIndexed - элемент не будет индексирован службой индексации содержимого операционной системы
  • Offline - файл находится в автономном состоянии и в данный момент недоступен
  • ReadOnly - элемент доступен только для чтения
  • System - элемент, используемый исключительно операционной системой
  • Temporary - элемент помечен как временный и может быть удален после завершения работы приложения
  • ReparsePoint, SparseFile - только для файловой системы NTFS
CreationTime, LastAccessTime, LastWriteTime Свойство типа DateTime, определяющее временные характеристики файловой единицы (время создания, время последнего доступа и время последнего обновления)
CreationTimeUtc, LastAccessTimeUtc, LastWriteTimeUtc То же, что предыдущее, только по Гринвичу
Exists Абстрактное свойство только для чтения, значение которого true, если для созданного объекта-наследника данных файл или каталог существует
FullName Свойство get типа String, содержащее полное квалифицированное имя файла или каталога
Name Абстрактное свойство-заготовка только для чтения, предназначенная для хранения имени файла без пути, но с расширением, или имени каталога
Extension Свойство get типа String, содержит только расширение файла
Delete() Абстрактная заготовка для удаления файла или каталога в производных классах
Refresh() Синхронизирует созданный ранее объект данных каталога или файла с последними изменениями файловой системы, выполненными через другие инструменты

Экземплярные классы DirectoryInfo и FileInfo не только реализуют унаследованные члены, но и дополняют (расширяют) базовый класс FileSystemInfo своими уникальными членами. Некоторые из них приведены в таблицах ниже.

Таблица 18.5. Некоторые уникальные члены класса DirectoryInfo
Член Описание
Create() Создает каталог, указанный ранее в конструкторе при создании экземпляра DirectoryInfo
CreateSubdirectory() Создает подкаталог
Delete() Удаляет пустой каталог
Delete(bool recursive) Удаляет каталог вместе с деревом подкаталогов, если аргумент равен true
GetDirectories() Возвращает список объектов данных подкаталогов типа DirectoryInfo для текущего каталога. Имеет перегрузки, которые допускают использование шаблонов поиска, удовлетворяющих требуемому условию
GetFiles() Возвращает список объектов данных типа FileInfo для файлов текущего каталога. Метод имеет перегрузки, позволяющие использовать стандартные символы шаблонов поиска '*' и '?'. Шаблон '?' представляет любой единственный символ, а шаблон '*' - любую последовательность символов из нуля и более, например, *.txt ищет все текстовые файлы
Parent Свойство возвращает объект данных DirectoryInfo родительского каталога для указанного подкаталога
Root Свойство возвращает объект данных DirectoryInfo, представляющий корневой каталог

Таблица 18.6. Некоторые уникальные члены класса FileInfo
Член Описание
Directory Возвращает экземпляр класса DirectoryInfo, представляющий каталог размещения файла
DirectoryName Возвращает строку с полным именем родительского каталога
Exists Возвращает флаг, определяющий, существует ли указанный файл
IsReadOnly Булево свойство определяет или устанавливает атрибут файла "только для чтения"
Length Длинное целое, возвращающее размер файла в байтах
Name Переопределенное свойство содержит имя файла
CopyTo() Копирует связанный с объектом данных файл в новое место с указанным именем и возвращает новый объект данных FileInfo, представляющий новую копию. Перегрузка с флагом разрешает перезапись, если целевой файл уже существует
Create() Создает файл и возвращает объект-оболочку потока FileStream, который можно использовать для записи
CreateText() Создает файл и возвращает объект-оболочку потока StreamWriter, который можно использовать для записи
AppendText() Создает и возвращает поток StreamWriter для добавления текста в файл, связанный с объектом FileInfo
Open(System.IO.FileMode) Возвращает объект FileStream и открывает файл в заданном режиме FileMode:
  • Append - добавлять в конец файла
  • Create - если файл несуществует, то создать, иначе очистить существующий
  • CreateNew - создает и открывает новый файл. Если файл уже существует, выдает исключение
  • Open - требует открыть файл в режиме, установленном перечислением FileAccess. Если файл не существует, выдается исключение FileNotFoundException
  • OpenOrCreate - существующий файл открыть, иначе создать файл
  • Truncate - открыть файл с очисткой до нулевой длины
Open(System.IO.FileMode, System.IO.FileAccess) Возвращает объект FileStream. Представляет вариации открытия файла с вариациями доступа, определяемыми перечислением FileAccess:
  • Read - только для чтения
  • ReadWrite - для чтения и записи
  • Write - только для записи
Open(System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare) Возвращает объект FileStream. Представляет вариации открытия файла с вариациями доступа, включая возможность одновременного доступа других объектов-потоков FileStream к данному файлу. Права других потоков при совместном доступе определяются перечислением FileShare:
  • Delete - разрешено удаление файла
  • None - не разрешать совместное использование файла
  • Read - разрешить сторонним потокам только чтение
  • ReadWrite - разрешить совместные чтение и запись
  • Write - разрешить совместную запись
OpenRead() Создает поток FileStream только для чтения и возвращает его
OpenWrite() Создает поток FileStream только для записи и возвращает его
OpenText() Создает и возвращает поток StreamReader для чтения в кодировке UTF8 из существующего текстового файла
Encrypt() Шифрует файл
Decrypt() Дешифрует файл
Delete() Удаляет файл физически
Replace() Заменяет содержимое указанного файла содержимым файла, связанного с текущим FileInfo. Целевой файл удаляется, а вместо него создается резервная копия с указанным именем, но параметры целевого файла возвращаются методом в виде объекта FileInfo

Экземплярные классы DirectoryInfo и FileInfo имеют только параметризованные конструкторы, ожидающие строку каталога или файла с полным путем. Путь не обязательно должен соответствовать реально существующему файлу или каталогу. Если указанный путь не существует, то свойство Exists объекта будет иметь значение false.

Свойства объектов извлекают информацию из файловой системы только один раз при первом обращении. При следующих обращениях они не обновляют эту информацию. Это может привести к расхождению с действительностью, если файл в данный момент будет модифицирован сторонней программой, а не этим объектом. Для обновления информации в экземпляре нужно выполнить метод Refresh().

Если указанный файл или каталог не существует, то их можно создать. Ниже приведен пример такой функции.

static void CreateFile(string fileName) // Нужно полное имя файла
        {
            string file = Path.GetFileName(fileName);       // Только имя файла
            string dir = Path.GetDirectoryName(fileName);   // Только полный путь
            string path = Path.Combine(dir, file);          // Опять fileName
            /*
            Console.WriteLine("fileName = {0}", fileName);
            Console.WriteLine("file = {0}", file);
            Console.WriteLine("dir = {0}", dir);
            Console.WriteLine("path = {0}", path);
            */
            DirectoryInfo myDir = new DirectoryInfo(dir);
            FileInfo myFile = new FileInfo(fileName);
            if (!myDir.Exists)      // Если каталог не существует
            {
                myDir.Create();     // Создать каталог    
                myFile.Create();    // Создать файл
            }
            else if (!myFile.Exists)// Если файл не существует
                myFile.Create();    // Создать файл
        }
Листинг 18.3 . Пример создания файла и каталога

Вызов функции CreateFile() может быть таким

Program.CreateFile(@"C:\Tmp111\TTT\fileName.txt");

Методы GetFiles() и GetDirectories() классов Directory или DirectoryInfo с заданными шаблонами поиска или без них осуществляют поиск информации только для текущего каталога. Чтобы пройтись по всем вложенным подкаталогам, нужно применить рекурсивную логику поиска. В следующем примере используется рекурсивный вызов функции для подсчета размера файлов, находящихся в указанном каталоге и во всех подчиненных ему подкаталогах файлового дерева.

static long GetDirectorySize(DirectoryInfo directory, bool includeSubdirectories)
        {
            Console.WriteLine(directory.FullName);
            long totalSize = 0;
    
            // Просуммировать размеры файлов в текущем каталоге
            FileInfo[] files = directory.GetFiles();
            foreach (FileInfo file in files)
                totalSize += file.Length;
    
            // Рекурсивно обходим подкаталоги
            if (includeSubdirectories)
            {
                DirectoryInfo[] dirs = directory.GetDirectories();
                foreach (DirectoryInfo dir in dirs)
                    totalSize += GetDirectorySize(dir, true);
            }
    
            return totalSize;
        }
Листинг 18.4 . Пример подсчета размера файлов дерева каталогов

Вызов функции GetDirectorySize() может быть таким

String path = @"E:\Tmp";
            long totalSize = Program.GetDirectorySize(new DirectoryInfo(path), true);
            Console.WriteLine(totalSize);
Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?