C# → Работа с файловой системой

Пример кода, демонстрирующий возможности работы с файловой системой на C#.

файловой системой C#

Пример реализации:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace ListView
{
    public partial class Form1 : Form
    {
        // поле для хранения предыдущих папок
        private System.Collections.Specialized.StringCollection folderCol;

        public Form1()
        {
            InitializeComponent();
            // инициализация списка истории папок
            folderCol = new System.Collections.Specialized.StringCollection();
            CreateHeadersAndFillListView();  // создание полей в ListView
            PaintListView(@"C:");  // заполнение (root = C:)
            folderCol.Add(@"C:");  // добавление в историю
            stStrip.Items[1].Text = "Detail"; // добавляем в StatuBar вид

            lwFilesAndFolders.ItemActivate += new EventHandler(lwFilesAndFolders_ItemActivate);
        }

        // при двойном щелчке
        private void lwFilesAndFolders_ItemActivate(object sender, EventArgs e)
        {
            System.Windows.Forms.ListView lw = (System.Windows.Forms.ListView)sender;
            // Tag содержит полный путь к фалу (папке)
            string filename = lw.SelectedItems[0].Tag.ToString(); 

            if (lw.SelectedItems[0].ImageIndex != 0)  // если файл
            {
                try
                {
                    // попытка запустить файл
                    System.Diagnostics.Process.Start(filename);
                }
                catch
                {
                }
            }
            else
            {
                PaintListView(filename);
                folderCol.Add(filename);
            }
        }

        // создает заголовки и заполняет ListView
        private void CreateHeadersAndFillListView()
        {
            // заголовки
            ColumnHeader colHead;

            colHead = new ColumnHeader();
            colHead.Text = "Имя файла";
            colHead.Width = 150;
            lwFilesAndFolders.Columns.Add(colHead);

            colHead = new ColumnHeader();
            colHead.Text = "Размер";
            lwFilesAndFolders.Columns.Add(colHead);

            colHead = new ColumnHeader();
            colHead.Text = "Последний доступ";
            lwFilesAndFolders.Columns.Add(colHead);
        }

        // заполняет ListView именами каталогов и файлов
        private void PaintListView(string root)
        {
            try
            {
                ListViewItem lvi;   // элемент проссматриваегомого списка
                ListViewItem.ListViewSubItem lvsi; // субэлементы (столбец списка)

                // если отсутствует корневая папка - ничего не делаем
                if (root.CompareTo("") == 0)
                    return;

                // получение инф. о корневой папке
                System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(root);

                // извлечение файлов и папок, находящихся в корневой папке
                System.IO.DirectoryInfo[] dirs = dir.GetDirectories();  // папки
                System.IO.FileInfo[] files = dir.GetFiles(); // файлы

                lwFilesAndFolders.Items.Clear(); // очистка элементов (без заголовков)

                stStrip.Items[0].Text = root;   // маркируем текущий путь

                // отключаем перерисовку на момент добавления компонентов
                lwFilesAndFolders.BeginUpdate(); 

                // проход в цикле по всем ПАПКАМ и включение их в список
                foreach (System.IO.DirectoryInfo di in dirs)
                {
                    // создание основного элемента ListViewItem
                    lvi = new ListViewItem();
                    lvi.Text = di.Name;     // имя папки
                    lvi.ImageIndex = 0;     // индекс иконки (папки)
                    lvi.Tag = di.FullName;  // полный путь к папке

                    // создание 2 элементов ListVIewSubItem (для 2 доп.столбцов)
                    lvsi = new ListViewItem.ListViewSubItem();
                    lvsi.Text = "";         // у папок размер отсутствует

                    lvi.SubItems.Add(lvsi);  // включение элемента в ListViewItem

                    lvsi = new ListViewItem.ListViewSubItem();
                    lvsi.Text = di.LastAccessTime.ToString();   // последний столбец

                    lvi.SubItems.Add(lvsi);  // включение элемента в ListViewItem

                    // включение элемента ListViewItems в семейство Items
                    lwFilesAndFolders.Items.Add(lvi);   
                }

                // проход в цикле по всем ФАЙЛАМ и включение их в список
                foreach (System.IO.FileInfo fi in files)
                {
                    // создание основного элемента ListViewItem
                    lvi = new ListViewItem();
                    lvi.Text = fi.Name;     // имя файла
                    lvi.ImageIndex = 1;     // индекс иконки (папки)
                    lvi.Tag = fi.FullName;  // полный путь к файлу

                    // создание 2 элементов ListVIewSubItem (для 2 доп.столбцов)
                    lvsi = new ListViewItem.ListViewSubItem();
                    lvsi.Text = fi.Length.ToString();         // у папок размер отсутствует

                    lvi.SubItems.Add(lvsi);  // включение элемента в ListViewItem

                    lvsi = new ListViewItem.ListViewSubItem();
                    lvsi.Text = fi.LastAccessTime.ToString();   // последний столбец

                    lvi.SubItems.Add(lvsi);  // включение элемента в ListViewItem

                    // включение элемента ListViewItems в семейство Items
                    lwFilesAndFolders.Items.Add(lvi);
                }

                // снятие запрета на прорисовку
                lwFilesAndFolders.EndUpdate();

            }
            catch (Exception err)
            {
                MessageBox.Show("Ошибка:" + err.Message);
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (folderCol.Count > 1)
            {
                PaintListView(folderCol[folderCol.Count - 2].ToString());
                folderCol.RemoveAt(folderCol.Count - 1);
            }
            else
            {
                PaintListView(folderCol[0].ToString());
            }
        }

        private void rbLargeIcon_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rb = (RadioButton)sender;

            switch (rb.Text)
            {
                case "LargeIcon": lwFilesAndFolders.View = View.LargeIcon;
                    stStrip.Items[1].Text = "LargeIcon";
                    break;
                case "SmallIcon": lwFilesAndFolders.View = View.SmallIcon;
                    stStrip.Items[1].Text = "SmallIcon";
                    break;
                case "List": lwFilesAndFolders.View = View.List;
                    stStrip.Items[1].Text = "List";
                    break;
                case "Details": lwFilesAndFolders.View = View.Details;
                    stStrip.Items[1].Text = "Details";
                    break;
                default: lwFilesAndFolders.View = View.Details;
                    stStrip.Items[1].Text = "Details";
                    break;
            }
        }
    }
}