Манипулирование файлами и каталогами в 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";

            // Check if the file exists or not
            if (File.Exists(filePath))
            {
                // Delete file
                File.Delete(filePath);

                // Check again
                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 that user enters.
                // Example: C:/test/test2.txt
                string newFilename = Console.ReadLine();

                if (newFilename != String.Empty)
                {
                    // Rename the file may include moving the file to another folder and renaming the file.
                    // You must ensure that the destination folder exists.
                    // (Else, DirectoryNotFoundException will be thrown). 
                    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";

            // Check if a directory path exists or not.
            bool  exist = Directory.Exists(dirPath);

            // If not exist, create it
            if (!exist)
            {
                Console.WriteLine(dirPath + " does not exist.");
                Console.WriteLine("Create directory: " + dirPath);

                // Create Directory
                Directory.CreateDirectory(dirPath);
            }

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

            // Print out infos

            // Creation time
            Console.WriteLine("Creation time: "+ Directory.GetCreationTime(dirPath));

            // Last Write time.
            Console.WriteLine("Last Write Time: " + Directory.GetLastWriteTime(dirPath));

            // Parent directory
            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)
        {
            // A directory path.
            String dirPath = "C:/test/CSharp";

            // If this path exists.
            if (!Directory.Exists(dirPath))
            {
                Console.WriteLine(dirPath + " does not exist.");
                Console.Read();

                // End method.
                return;
            }

            Console.WriteLine(dirPath + " exist");


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

            // String that the user enters.
            // example: C:/test2/Java
            string newDirname = Console.ReadLine();

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

                // End
                return;
            }

            // If the user enters a new directory path already exists.
            if (Directory.Exists(newDirname))
            {
                Console.WriteLine("Cannot rename directory. New directory already exist.");
                Console.Read();

                // End
                return;
            }

            // Parent directory.
            DirectoryInfo parentInfo = Directory.GetParent(newDirname);

            // Create parent folder of the new folder that the user enters.
            Directory.CreateDirectory(parentInfo.FullName);

            // You can change folder name.
            // It can make that folder to move from existing parent directory.
            // But you must ensure that the new parent directory have been already existed
            // (Else, DirectoryNotFoundException will be thrown)
            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 method to list the subfolders of a folder.
        public static void PrintDirectory(string dirPath)
        {
            try
            {
                // You do not have sufficient  access to the folder 'dirPath',
                // UnauthorizedAccessException exception will be thrown.
                IEnumerable<string> enums = Directory.EnumerateDirectories(dirPath);

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

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

                    // Recursive to search subdirectories.
                    PrintDirectory(dir);
                }
            }
            // Security error.
            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)
        {
            // An object that represents a file.
            FileInfo testFile = new FileInfo("C:/test/test.txt");

 

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

                // Creation time
                Console.WriteLine("Creation time: " + testFile.CreationTime);

                // Last Write Time
                Console.WriteLine("Last Write Time " + testFile.LastWriteTime);

                // Directory containing
                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 that user enters
            // example: C:/test/test2.txt
            string newFilename = Console.ReadLine();

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

                Console.Read();

                // End method
                return;
            }

            FileInfo newFileInfo = new FileInfo(newFilename);

            // If newFileInfo exist (Can not rename).
            if (newFileInfo.Exists)
            {
                Console.WriteLine("Can not rename file to " + newFileInfo.FullName + ". File already exist.");

                Console.Read();

                // End method
                return;
            }

            // Create parent directory of newFileInfo
            newFileInfo.Directory.Create();

            // Rename
            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)
        {
            // An object representing a folder.
            DirectoryInfo dirInfo = new DirectoryInfo("C:/Windows/System32/drivers");

            // Write out creation time.
            Console.WriteLine("Creation time: " + dirInfo.CreationTime);

            // Last write time
            Console.WriteLine("Last Write Time " + dirInfo.LastWriteTime);

            // Full name
            Console.WriteLine("Directory Name: " + dirInfo.FullName);

            // Array of subfolders.
            DirectoryInfo[] childDirs = dirInfo.GetDirectories();

            // An array of files in the folder
            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(" ============================== ");

                // Name of Drive
                Console.WriteLine("Drive {0}", drive.Name);

                // Drive type (Removable,..)
                Console.WriteLine("  Drive type: {0}", drive.DriveType);

                // If drive is ready.
                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();
        }
    }

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