Манипулирование файлами и каталогами в C#

1- Иерархия классов

Class Описание
File Файл - это служебный класс. Он предоставляет методы для создания, копирования, удаления, перемещения и открытия одного файла, а также помогает в создании объектов FileStream.
Directory Directory (каталог) - это служебный класс. Он предоставляет статические методы для создания, перемещения и перечисления через каталоги и подкаталоги. Этот класс не может быть унаследован.
FileInfo FileInfo - класс, представляющий файл. Он предоставляет свойства и методы экземпляров для создания, копирования, удаления, перемещения и открытия файлов, а также помогает в создании объектов FileStream. Этот класс не может быть унаследован.
DirectoryInfo DirectoryInfo - это класс, представляющий каталог. Он предоставляет методы для создания, перемещения и перечисления через каталоги и подкаталоги. Этот класс не может быть унаследован.
DriveInfo DirveInfo - это класс, он обеспечивает доступ к информации на диске.

2- File

Файл - это утилитарный класс. Он предоставляет методы для создания, копирования, удаления, перемещения и открытия одного файла, а также помогает в создании объектов FileStream.
В приведенном ниже примере проверяется, существует ли ссылка к файлу или нет, удалите этот файл, если он существует.
DeleteFileDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
    class DeleteFileDemo
    {
        public static void Main(string[] args)
        {
            string filePath = "C:/test/test.txt";

            // Проверить существует ли данная ссылка или нет?
            if (File.Exists(filePath))
            {
                // Удалить файл
                File.Delete(filePath);

                // Проверить существует ли еще файл.
                if (!File.Exists(filePath))
                {
                    Console.WriteLine("File deleted...");
                }

            }
            else
            {
                Console.WriteLine("File test.txt does not yet exist!");
            }

            Console.ReadKey();
        }
    }

}
Запуск примера:
Переименование файла это действие, которое может включать в себя перемещение файла в другую папку и переименование файла. В случае перемещения файла в новую папку, убедитесь, что эта папка существует.
RenameFileDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
    class RenameFileDemo
    {
        public static void Main(string[] args)
        {
            String filePath = "C:/test/test.txt";

            if (File.Exists(filePath))
            {
                Console.WriteLine(filePath + " exist");

                
                Console.WriteLine("Please enter a new name for this file:");
                
                // String, который вводит пользователь.
                // Например: C:/test/test2.txt
                string newFilename = Console.ReadLine();

                if (newFilename != String.Empty)
                {
                    // Переименовать файл:
                    // Может включать, передачу файла к другой родительской папке, и переименование файла.
                    // Нужно удостовериться, что новая родительская папка существует.
                    // (если нет, исключение DirectoryNotFoundException будет выброшено).
                    File.Move(filePath, newFilename);

                    if (File.Exists(newFilename))
                    {
                        Console.WriteLine("The file was renamed to " + newFilename); 
                    }
                }
            }
            else
            {
                Console.WriteLine("Path " + filePath + " does not exist.");
            }

            Console.ReadLine();
        }
    }

}
Запуск примера:

3- Directory

Directory (каталог) - это утилитарный класс. Он предоставляет статические методы для создания, перемещения и перечисления каталогов и подкаталогов. Этот класс не позволяет иметь подклассы.
Например, проверьте, существует ли ссылка к каталогу или нет, если не существует, создайте этот каталог, запишите время создания, время последней записи в каталог, ....
DirectoryInformationDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
    class DirectoryInformationDemo
    {
        public static void Main(string[] args)
        {
            String dirPath = "C:/test/CSharp";

            // Проверить существует ли ссылка папки или нет.
            bool  exist = Directory.Exists(dirPath);

            // Если нет, то создать данную папку.
            if (!exist)
            {
                Console.WriteLine(dirPath + " does not exist.");
                Console.WriteLine("Create directory: " + dirPath);

                // Создать папку.
                Directory.CreateDirectory(dirPath);
            }

            Console.WriteLine("Directory Information " + dirPath);

            // Распечатать информацию папки выше.
            // Время создания папки.
            Console.WriteLine("Creation time: "+ Directory.GetCreationTime(dirPath));

            // Время последнего изменения папки.
            Console.WriteLine("Last Write Time: " + Directory.GetLastWriteTime(dirPath));

            // Родительская папки.
            DirectoryInfo parentInfo = Directory.GetParent(dirPath);

            Console.WriteLine("Parent directory: " + parentInfo.FullName);


            Console.Read();
        }
    }
     
}
Запуск примера:
Переименование  каталога:
Вы можете изменить имя каталога. Он может переместить эту папку из существующего родительского каталога. Но вы должны убедиться, что новый родительский каталог уже существует. Пример ниже иллюстрирует, как переименовать каталог:
RenameDirectoryDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
    class RenameDirectoryDemo
    {
        public static void Main(string[] args)
        {
            // Ссылка папки.
            String dirPath = "C:/test/CSharp";

            // Если данная ссылка существует.
            if (!Directory.Exists(dirPath))
            {
                Console.WriteLine(dirPath + " does not exist.");
                Console.Read(); 

                return;
            } 

            Console.WriteLine(dirPath + " exist");


            Console.WriteLine("Please enter a new name for this directory:");

            // String который вводит пользователь.
            // Например: C:/test2/Java
            string newDirname = Console.ReadLine();

            if (newDirname == String.Empty)
            {
                Console.WriteLine("You not enter new directory name. Cancel rename.");
                Console.Read();
 
                return;
            }

            // Если ссылка, которую вводит пользователь существует.
            if (Directory.Exists(newDirname))
            {
                Console.WriteLine("Cannot rename directory. New directory already exist.");
                Console.Read();
 
                return;
            }

            // Родительская папка.
            DirectoryInfo parentInfo = Directory.GetParent(newDirname);

            // Создать родительскую папку папки введенной пользователем.
            Directory.CreateDirectory(parentInfo.FullName);

            // Вы можете поменять ссылку (path) папки.
            // но нужно удостовериться, что родительская ссылка новой ссылки существует.
            // (Если нет, исключение DirectoryNotFoundException будет выброшено).
            Directory.Move(dirPath, newDirname);

            if (Directory.Exists(newDirname))
            {
                Console.WriteLine("The directory was renamed to " + newDirname);
            }


            Console.ReadLine();
        }
    }

}
Запуск примера:
Пример ниже рекурсия и распечатка всех подкаталогов, (дочерних,внуков, ... ) каталога.
EnumeratingDirectoryDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
    class EnumeratingDirectoryDemo
    {
        public static void Main(string[] args)
        {
            string dirPath = "C:/Windows/System32";

            PrintDirectory(dirPath);

            Console.Read();
        }

        // Рекурсивный метод (Recursive) перечисляет все подпапки одной папки.
        public static void PrintDirectory(string dirPath)
        {
            try
            {
                // Если вы не имеете права доступа в папку 'dirPath'
                // исключение UnauthorizedAccessException будет выброшено
                IEnumerable<string> enums = Directory.EnumerateDirectories(dirPath);

                
                List<string> dirs = new List<string>(enums);

                foreach (var dir in dirs)
                {
                    Console.WriteLine(dir);


                    PrintDirectory(dir);
                }
            }
            // Ошибка безопасности при доступе в папку, в которую у вас нет права.
            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine("Can not access directory: " + dirPath);
                Console.WriteLine(e.Message);
            }
        }
    }

}
Запуск примера:

4- FileInfo

FileInfo - класс, представляющий файл. Он предоставляет свойства и методы для создания, копирования, удаления, перемещения и открытия файла. Также помогает в создании объекта  FileStream. Этот класс не позволяет иметь подклассы
Разница между 2 классами  File и FileInfo заключается в том, что File - это утилитарный класс, все его методы - статические, а  FileInfo представляет определенный файл.
FileInfoDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
 
namespace FileDirectoryTutorial
{
    class FileInfoDemo
    {
        static void Main(string[] args)
        {
            // Объект представляющий файл.
            FileInfo testFile = new FileInfo("C:/test/test.txt");

 

            if (testFile.Exists)
            {
                Console.WriteLine(testFile.FullName + " exist.");

                // Информация времени создания файла.
                Console.WriteLine("Creation time: " + testFile.CreationTime);

                // Информация, когда файл был изменен в последний раз.
                Console.WriteLine("Last Write Time " + testFile.LastWriteTime);

                // Имя папки, содержащей данный файл.
                Console.WriteLine("Directory Name: " + testFile.DirectoryName);
            }
            else
            {
                Console.WriteLine(testFile.FullName + " does not exist.");
            }
            Console.Read();
        } 
    }

}
Запуск примера:
Переименование файла может включать в себя перемещение файла в другой каталог и переименование файла. В случае перемещения файла в другую каталог, нужно убедиться, что этот каталог существует.
RenameFileInfoDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
    class RenameFileInfoDemo
    {
        public static void Main(string[] args)
        {

            FileInfo fileInfo = new FileInfo("C:/test/test.txt");

            if (!fileInfo.Exists)
            {
                Console.WriteLine(fileInfo.FullName + " does not exist.");
                Console.Read();
 
                return;
            }


            Console.WriteLine(fileInfo.FullName + " exist");


            Console.WriteLine("Please enter a new name for this file:");

            // String, который введен пользователем.
            // Пример: C:/test/test2.txt
            string newFilename = Console.ReadLine();

            if (newFilename == String.Empty)
            {
                Console.WriteLine("You not enter new file name. Cancel rename");

                Console.Read();
 
                return;
            }

            FileInfo newFileInfo = new FileInfo(newFilename);

            // Если 'newFileInfo' существует (Невозможно переименовать).
            if (newFileInfo.Exists)
            {
                Console.WriteLine("Can not rename file to " + newFileInfo.FullName + ". File already exist.");

                Console.Read();
                 
                return;
            }

            // Создать родительскую папку 'newFileInfo'.
            newFileInfo.Directory.Create();

            // Переименовать файл.
            fileInfo.MoveTo(newFileInfo.FullName);

            // Refresh. 
            newFileInfo.Refresh();

            if (newFileInfo.Exists)  
            {
                Console.WriteLine("The file was renamed to " + newFileInfo.FullName);
            } 

            Console.ReadLine();
        }
    }

}
Запуск примера:

5- DirectoryInfo

DirectoryInfo - это класс, представляющий каталог. Он предоставляет методы для создания, перемещения и перечисления каталогов и подкаталогов. Этот класс не позволяет иметь подклассы
Разница между 2 классами  Directory и DirectoryInfo заключается в том, что  Directory является утилитарным классом, все его методы являются статическими, а DirectoryInfo представляет конкретный каталог.
DirectoryInfoDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
    class DirectoryInfoDemo
    {
        static void Main(string[] args)
        {
            // Объект представляет папку.
            DirectoryInfo dirInfo = new DirectoryInfo("C:/Windows/System32/drivers");

            // Записать информацию.  
            // Информация дня создания файла.
            Console.WriteLine("Creation time: " + dirInfo.CreationTime);

            // Информация времени последнего изменения файла.
            Console.WriteLine("Last Write Time " + dirInfo.LastWriteTime);

            // Название папки.
            Console.WriteLine("Directory Name: " + dirInfo.FullName);

            // Массив подпапок.
            DirectoryInfo[] childDirs = dirInfo.GetDirectories();

            // Массив файлов находящихся в папке.
            FileInfo[] childFiles = dirInfo.GetFiles();

            foreach(DirectoryInfo childDir in childDirs ){
                Console.WriteLine(" - Directory: " + childDir.FullName);
            }

            foreach (FileInfo childFile in childFiles)
            {
                Console.WriteLine(" - File: " + childFile.FullName);
            }


            Console.Read();
        }
    }

}
Запуск примера:

6- DriveInfo

DirveInfo - это класс, он обеспечивает методы доступа к информации на диске.
DriveInfoDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
    class DriveInfoDemo
    {
        static void Main(string[] args)
        {
            DriveInfo[] drives = DriveInfo.GetDrives();

            foreach (DriveInfo drive in drives)
            {
                Console.WriteLine(" ============================== ");

                // Имя драйва (C, D, ..)
                Console.WriteLine("Drive {0}", drive.Name);

                // Тип драйва (Removable,..)
                Console.WriteLine("  Drive type: {0}", drive.DriveType);

                // Если драйв готов.
                if (drive.IsReady)
                {
                    Console.WriteLine("  Volume label: {0}", drive.VolumeLabel);
                    Console.WriteLine("  File system: {0}", drive.DriveFormat);
                    Console.WriteLine(
                        "  Available space to current user:{0, 15} bytes",
                        drive.AvailableFreeSpace);

                    Console.WriteLine(
                        "  Total available space:          {0, 15} bytes",
                        drive.TotalFreeSpace);

                    Console.WriteLine(
                        "  Total size of drive:            {0, 15} bytes ",
                        drive.TotalSize);
                }
            }

            Console.Read();
        }
    }

}
Запуск примера: