При выполнении в лабораторной работе упражнения №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" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Работа с файлами и каталогами
Классы DirectoryInfo и FileInfo
Эти классы прописаны в библиотеке с ключевым словом sealed (запечатанный), запрещающим использование в качестве базовых, и поэтому они не могут иметь наследников. В отличие от классов Directory и File, которые содержат только статические методы, эти классы содержат еще и свойства, а методы в них являются экземплярными. Это позволяет создавать целевые объекты данных, содержащие информацию о файловой системе компьютера.
Классы DirectoryInfo и FileInfo имеют общего родителя - абстрактный класс FileSystemInfo, который наделяет их базовым набором методов и свойств. Некоторые из этих членов приведены в таблице.
Экземплярные классы DirectoryInfo и FileInfo не только реализуют унаследованные члены, но и дополняют (расширяют) базовый класс FileSystemInfo своими уникальными членами. Некоторые из них приведены в таблицах ниже.
Член | Описание |
---|---|
Create() | Создает каталог, указанный ранее в конструкторе при создании экземпляра DirectoryInfo |
CreateSubdirectory() | Создает подкаталог |
Delete() | Удаляет пустой каталог |
Delete(bool recursive) | Удаляет каталог вместе с деревом подкаталогов, если аргумент равен true |
GetDirectories() | Возвращает список объектов данных подкаталогов типа DirectoryInfo для текущего каталога. Имеет перегрузки, которые допускают использование шаблонов поиска, удовлетворяющих требуемому условию |
GetFiles() | Возвращает список объектов данных типа FileInfo для файлов текущего каталога. Метод имеет перегрузки, позволяющие использовать стандартные символы шаблонов поиска '*' и '?'. Шаблон '?' представляет любой единственный символ, а шаблон '*' - любую последовательность символов из нуля и более, например, *.txt ищет все текстовые файлы |
Parent | Свойство возвращает объект данных DirectoryInfo родительского каталога для указанного подкаталога |
Root | Свойство возвращает объект данных DirectoryInfo, представляющий корневой каталог |
Экземплярные классы 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);