При выполнении в лабораторной работе упражнения №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" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Работа с файлами и каталогами
Все необходимые для выполнения данной работы программы можно найти в прилагаемом каталоге.
Для работы с файлами библиотека .NET Framework имеет достаточное количество классов. Познакомимся с ними. Простейшим уровнем файловых операций является получение информации о файлах и каталогах, смена каталогов, получение сведений о размерности файлов, времени создания, режиме доступа, удаления, переименования, копирования и т.д. без их открытия. Для этого имеются следующие библиотечные классы пространства имен System.IO ( input, output ) сборки mscorlib.dll:
- Directory, File - предоставляют статические методы (объекта-типа) для сбора информации о файлах и каталогах локального компьютера или сервера
- DriveInfo, DirectoryInfo, FileInfo - предоставляют экземплярные методы и свойства (объектов-экземпляров) для тех же целей
Классы Directory и File
Если взглянуть на классы Directory и File через панель Object Browse r, то можно убедиться, что эти классы имеют только статические методы, приведенные ниже. Предполагается, что если есть методы чтения Get, то есть и дуальные методы Set, которые в таблицах не указаны.
Метод | Описание |
---|---|
CreateDirectory() | Создает каталог вместе с указанным путем |
Delete() | Удаляет пустой каталог, если второй необязательный параметр не указан или равен false, то каталог с содержимым метод удалять отказывается. Если второй параметр указан и равен true, то удаляет каталог со всем содержимым |
Exists() | Возвращает флаг существования каталога |
GetCreationTime(), GetLastAccessTime(), GetLastWriteTime() | Возвращают структуру DateTime, которая содержит время создания каталога, время последнего чтения или записи |
GetDirectories(), GetFiles(), GetLogicalDrives() | Возвращает массив строк, по одной на каждый подкаталог, файл или устройство в указанном каталоге (в зависимости от используемого метода). Методы имеют перегрузку, задающую шаблон (фильтр) поиска (например, My*.txt, My???.*, *My.exe, *my*). Регистр в шаблонах поиска значения не имеет |
GetParent() | Анализирует переданную строку и возвращает имя родительского каталога |
GetCurrentDirectory() | Возвращает текущий каталог с полным путем |
Move() | Принимает два строки - исходный каталог и целевой каталог с полными путями. Перемещает исходный каталог в указанное место в пределах одного дискового устройства (иначе, - копирует) |
GetAccessControl() | Возвращает объект со списком контроля доступа Windows |
Метод | Описание |
---|---|
Copy() | Копирует один файл в другой с возможной заменой содержимого существующего файла (если задан третий необязательный параметр true ) |
Delete() | Удаляет указанный файл, но не возбуждает исключение, если файл не найден |
Exists() | Проверяет существование файла и возвращает флаг |
GetAttributes() | Возвращает атрибуты указанного файла |
GetCreationTime(), GetLastAccessTime(), GetLastWriteTime() | Возвращают структуру DateTime, которая содержит время создания файла, время последнего чтения или записи |
Move() | Перемещает или переименовывает файлы |
Create(), CreateText() | Создают файл |
Open(), OpenText(), OpenRead(), OpenWrite() | Открывают файл, открывают только для чтения, открывают только для записи |
ReadAllText(), ReadAllLines(), ReadAllBytes() | Читают весь файл и возвращают его содержимое в виде строки, массива строк или массива байт |
WriteAllText(), WriteAllLines(), WriteAllBytes() | Пишут весь файл за один прием, использую принятую строку, массив строк или массив байт. Если файл существует, то он перезаписывается |
GetAccessControl() | Возвращает объект со списком контроля доступа Windows |
Упражнение 1. Получение списка файлов
Создадим приложение, которое извлекает список файлов текущего каталога сборки. Вывод имен файлов организуем на консоль и в списочный элемент Windows Forms одновременно.
- Создайте новые решение и проект командой File/New/Project в соответствии со снимком
- Командой Project/App1 Properties преобразуйте проект в консольное приложение настройкой списка Output type
- Откройте файл Program.cs и добавьте в него код, выделенный в следующем листинге
using System; using System.Collections.Generic; using System.Windows.Forms; // Добавляем пространство имен using System.IO; namespace App1 { class Program // Убрали слово static!!! { [STAThread] static void Main() { // Вызов нашей функции (new Program()).ConsoleOutput();// Через экземпляр - для куража! Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } // Вывод информации в консольное окно void ConsoleOutput() { // Настраиваем консоль Console.Clear(); Console.ForegroundColor = ConsoleColor.White; Console.CursorVisible = false; Console.WindowWidth = 70;// 80 знакомест - по умолчанию Console.WindowHeight = 20; Console.Title = "Список файлов каталога сборки"; string dir = Directory.GetCurrentDirectory(); // Каталог сборки string[] fileList = Directory.GetFiles(dir); // Список файлов int i = 0; // Счетчик foreach (string path in fileList) // Выводим список { Console.WriteLine("{0}) {1}", ++i, path); } Console.WriteLine(); i = 0; // Счетчик foreach (string path in fileList) // Выводим список { string file = path.Substring(path.LastIndexOf('\\') + 1);// Экранируем символ Console.WriteLine("{0}) {1}", ++i, file); } Console.WriteLine(); i = 0; // Счетчик foreach (string path in fileList) // Выводим список { string file = path.Substring(path.LastIndexOf(@"\") + 1);// Неинтерпретируемая строка Console.WriteLine("{0}) {1}", ++i, file); } Console.WriteLine(); i = 0; // Счетчик foreach (string path in fileList) // Выводим список { string file = Path.GetFileName(path); // Сразу чистое имя файла Console.WriteLine("{0}) {1}", ++i, file); } } } }Листинг 18.1 . Код файла Program.cs
Обратите внимание, что мы убрали перед объявлением класса ключевое слово static (для разнообразия). Поэтому нам пришлось создавать экземпляр класса, чтобы вызвать экземплярный метод вывода в консольное окно. Поскольку нам понадобился только одноразовый вызов метода, то не обязательно запоминать адрес экземпляра в ссылочной переменной, что мы и не стали делать.
- Запустите приложение - консольное окно наполняется вариантами вывода имен файлов
Вначале мы распечатали полные имена файлов, которые вернул метод Directory. GetFiles(). Такие имена иногда называют квалифицированными ( the fully qualified file name ), поскольку в файловой системе компьютера они однозначно определяют файлы как единицы информации. Для получения укороченного имени ( the relative file name ) мы использовали варианты, которых для решения одной и той же задачи обычно можно придумать несколько - обычно именно с таким запасом устроена библиотека .NET Framework.
Вывод в консольное окно мы организовали до того, как приложение войдет в цикл сообщений Windows, иначе консольное окно вначале появилось бы пустым и заполнилось бы только после закрытия диалогового окна. Но тогда все равно пришлось бы ставить задержку консольного окна, например, методом Console.ReadLine(), чтобы увидеть результаты до закрытия приложения.
Теперь настроим окно Windows Forms.
- Перейдите в режим Design файла Form1.c s и поместите из панели Toolbox на макет формы элемент ListBox, который настройте через панель Properties в соответствии с приведенной таблицей свойств
Компонент | Свойство | Значение |
---|---|---|
ListBox | (Name) | listBox1 |
Dock | Fill |
- Вызовите правой кнопкой мыши для макета формы контекстное меню и выполните команду View Code, чтобы перейти в кодовую часть формы. Заполните конструктор формы так
using System; using System.Windows.Forms; // Дополнительное подключение пространств имен using System.IO; namespace App1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); // Привязка массива к списку для отображения и печать результатов String[] fileList = Directory.GetFiles(Directory.GetCurrentDirectory()); for (int i = 0; i < fileList.Length; i++) fileList[i] = String.Format("{0}) {1}", i + 1, Path.GetFileName(fileList[i])); listBox1.DataSource = fileList; listBox1.SelectionMode = SelectionMode.None; } } }Листинг 18.2 . Код файла Form1.cs
- Запустите проект - результат должен быть таким (два окна на одном снимке)
Это приложение можно было бы довести до ума, дополнив диалоговым окном смены каталога, но мы пока рассматриваем инструменты пространства имен System.IO и отложем эту мысль на потом.