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

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

Упражнение 6. Простой просмотрщик файлов

Построим диалоговое приложение, позволяющее перемещаться по файловой системе и просматривать характеристики файлов. С оформлением пользовательского интерфейса сильно стараться не будем, а уделим больше внимания функциональности.

  • Добавьте к решению командой File/Add/New Project новый проект оконного приложения Windows Forms с именем App6 и назначьте его стартовым

  • В режиме Design выделите форму и установите для нее в панели Properties значения свойств
    • Text='Простой просмотрщик файлов', Size/Width=700, Size/Height=300
  • В режиме Design выделите форму и поместите из панели Toolbox дочерний компонент Panel (двойным щелчком на нем, или перетащите курсором). Установите для него в панели Properties значения свойств
    • Dock=Top, Size/Height=40
  • Опять выделите саму форму, щелкнув на ее заголовке (или свободном месте клиентской области), поместите еще один дочерний элемент Panel и установите для него свойство
    • Dock=Fill
  • Через выпадающий список панели Properties выделите объект panel1, поместите на него дочерний компонент Button и настройте свойства так:
    • (Name)=btnUp, Location/X=13, Location/Y=9, Text='Вверх'
  • Снова выделите на форме объект panel1 и добавьте на него текстовую метку Label со свойствами:
    • (Name)=lblCurrentDir, AutoSize=True, Location/X=103, Location/Y=12, Text='Текущий каталог: '
  • Выделите объект panel2, поместите на него дочерний компонент SplitContainer и сместите у него разделитель влево, чтобы ширина его левой панели ( Panel1 ) была меньше ширины правой ( Panel2 ) и составляла от нее примерно одну четверть
  • Выделите левую панель ( Panel1 ) объекта splitContainer1 и поместите в нее компонент ListBox со свойствами:
    • (Name)=listDir, Dock=Fill
  • Выделите правую панель ( Panel2 ) объекта splitContainer1 и поместите в нее компонент DataGridView со свойствами:
    • (Name)=gridFile, Dock=Fill, ColumnHeadersHeightSizeMode=AutoSize

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


  • Щелкните правой кнопкой мыши в любом месте на форме и выполните команду контекстного меню View Code, чтобы открыть кодовую часть - файл Form1.cs
  • Заполните файл Form1.cs следующим кодом
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
    
using System.IO;
    
namespace App6
{
    public partial class Form1 : Form
    {
        Panel fileDetails;// Поле, инициализируется неявно нулевым адресом: null
    
        public Form1()
        {
            InitializeComponent();
    
            // Программные донастройки
            gridFile.ReadOnly = true;       // Только для просмотра
            gridFile.SelectionMode =
                DataGridViewSelectionMode.FullRowSelect;// Выделять всю строку
    
            // Начальная информация
            currentPath = Directory.GetCurrentDirectory();
            ShowDirectoryContents(currentPath);
            fileDetails = splitContainer1.Panel2;
            fileDetails.AutoScroll = true;
        }
    
        String currentPath;// Поле, инициализируется неявно пустой строкой
        void ShowDirectoryContents(String path)
        {
            // Получить объект справки текущего каталога
            DirectoryInfo curDir = new DirectoryInfo(path);
    
            // Получить для текущего каталога 
            // объекты справки файлов и подкаталогов
            FileInfo[] files = curDir.GetFiles();
            DirectoryInfo[] dirs = curDir.GetDirectories();
            lblCurrentDir.Text = "Текущий каталог: " + path;
    
            // Привязываем к элементам отображения
            listDir.DataSource = dirs;
            listDir.DisplayMember = "Name"; // Отображаемый вектор
            listDir.ValueMember = "Name";   // Скрытый вектор
            gridFile.DataSource = files;    // Показываем все
        }
    
        private void btnUp_Click(object sender, EventArgs e)
        {
            // Уже "Мой компьютер" и выше некуда
            if (currentPath == String.Empty)
                return;
            // Хотим подняться выше текущего корня,
            // поэтому выводим доступные устройства
            else if (currentPath == Path.GetPathRoot(currentPath))
            {
                System.Collections.ArrayList array =
                    new System.Collections.ArrayList();
                DriveInfo[] drives = DriveInfo.GetDrives();
                // Фильтруем готовые устройства
                foreach (DriveInfo drive in drives)
                {
                    if (drive.IsReady)
                    {
                        String name = drive.Name;
                        name = name.Split('\\')[0];// Убираем слэш
                        array.Add(name);
                    }
                }
    
                listDir.DataSource = array; // Привязываем список доступных устройств
                gridFile.DataSource = null; // Нет файлов
                currentPath = String.Empty; // Пути нет
                lblCurrentDir.Text = "Мой компьютер";   // Меняем заголовок метки
    
                return;
            }
            // Находимся ниже корня текущего устройства
            // и есть куда подниматься
            else
            {
                String path = Path.Combine(currentPath, "..");
                currentPath = Path.GetFullPath(path);   // Этажом выше без '..'
                ShowDirectoryContents(currentPath);
            }
        }
    
        private void listDir_DoubleClick(object sender, EventArgs e)
        {
            String dir = listDir.SelectedValue.ToString();// Извлекаем из списка
            currentPath = Path.Combine(currentPath, dir);
            if (currentPath.IndexOf('\\') == -1)
                currentPath += "\\";    // Если только что спустились в корень
            ShowDirectoryContents(currentPath);
        }
    
        private void gridFile_Click(object sender, EventArgs e)
        {
            if (gridFile.Rows.Count == 0)
                return; // Нечего выделять
    
            // Локальные переменные инициализировать обязательно, а поля нет
            int selectIndex = gridFile.CurrentCell.RowIndex;
            DataGridViewRow row = gridFile.Rows[selectIndex];
            DataGridViewCellCollection cells = gridFile.Rows[selectIndex].Cells;
            String message = "";
    
            // Извлекаем информацию из текущей строки
            for (int i = 0; i < gridFile.Columns.Count; i++)
            {
                String columnName = gridFile.Columns[i].Name;
                String columnValue = row.Cells[i].Value.ToString();
                message += columnName + ":  " + columnValue + "\n";
            }
    
            // Создаем окно и выводим информацию
            Form frm = new Form();
            frm.Width = 500;
            frm.Height = 320;
            frm.Text = "Подробности";   // Заголовок окна
            frm.MinimizeBox = false;    // Убираем системные кнопки
            frm.MaximizeBox = false;    // Убираем системные кнопки
            frm.ShowInTaskbar = false;  // Не отображать в панели задач
            frm.StartPosition = FormStartPosition.CenterParent;// По центру родителя
    
            // Промежуточная панель - для скролирования
            Panel panel = new Panel();
            panel.BackColor = System.Drawing.Color.White;
            panel.Dock = DockStyle.Fill;
            panel.AutoScroll = true;
            frm.Controls.Add(panel);// Отдаем окну
    
            // Отображающая текстовая метка
            Label lbl = new Label();
            lbl.AutoSize = true;
            lbl.Parent = panel;     // Отдаем панели
            // panel.Controls.Add(lbl);// Вариант - отдаем панели
            lbl.Text = message;
    
            // Заряжаем дополнительные окна вывода раньше диалога
            Console.Clear(); Console.Write(message); // !!!!!!!!!!!!!!!!!!!!
            System.Diagnostics.Debug.Write(message + Environment.NewLine);
    
            frm.ShowDialog();   // Показываем окно в модальном режиме
        }
    }
}
  • Запустите приложение - пока оно не реагирует на действия пользователя, поскольку интерфейсные элементы не присоединены к своим обработчикам
  • В режиме Design выделите кнопку btnUp, зайдите в панель Properties, щелкните на пиктограмме Events, раскройте список поля для события Click и выберите обработчик btnUp_Click

  • Подобным же образом присоедините к событию DoubleClick объекта списка listDir обработчик listDir_DoubleClick, и к событию Click объекта сетки gridFile - обработчик gridFile_Click
  • Запустите приложение - при щелчке на строке сетки выбрасывается исключение

Причина в том, что в коде обработчика gridFile_Click делается попытка вывода информации в консольное окно, которое не создано. Если мы не хотим использовать консольное окно, то следует закомментировать или удалить строку

Console.Clear(); Console.Write(message); // !!!!!!!!!!!!!!!!!!!!

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

  • В панели Solution Explorer для узла App6 вызовите контекстное меню и выполните команду Properies

Другой способ - в панели Solution Explorer выделить узел проекта App6 (или любой член проекта App6 ) и выполнить команду главного меню оболочки Project/App6 Properties.

  • На вкладке Application окна настроек проекта в выпадающем списке Output type установите значение Console Application

  • Запустите и испытайте разработанное приложение

Один из рабочих моментов может выглядеть так


Еще один канал вывода подробностей, предусмотренный нами, - панель Output оболочки.

  • Разберитесь с кодом
Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №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" или один из зависимых от них компонентов. Не удается найти указанный файл.

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