betacode

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

  1. Иерархия классов
  2. File
  3. Directory
  4. FileInfo
  5. DirectoryInfo
  6. DriveInfo

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();
        }
    } 
}
Запуск примера:
File deleted...
Переименование файла это действие, которое может включать в себя перемещение файла в другую папку и переименование файла. В случае перемещения файла в новую папку, убедитесь, что эта папка существует.
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();
        }
    } 
}
Запуск примера:
C:/test/test.txt exist
Please enterr a new name for this file:
C:/test/test2.txt
The file was renamed to C:/test/test2.txt

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();
        }
    } 
}
Запуск примера:
Directory Information C:/test/CSharp
Creation time: 12/5/2015 9:46:10 PM
Last Write Time: 12/5/2015 9:46:10 PM
Parent directory: C:\test
Переименование каталога:
Вы можете изменить имя каталога. Он может переместить эту папку из существующего родительского каталога. Но вы должны убедиться, что новый родительский каталог уже существует. Пример ниже иллюстрирует, как переименовать каталог:
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();
        }
    } 
}
Запуск примера:
C:/test/CSharp exist
Please enter a new name for this directory:
C:/test2/Java
The directory was renamed to C:/test2/Java
Пример ниже рекурсия и распечатка всех подкаталогов, (дочерних,внуков, ... ) каталога.
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);
            }
        }
    } 
}
Запуск примера:
...
C:/Windows/System32\wbem\en-US
C:/Windows/System32\wbem\Logs
C:/Windows/System32\wbem\Repository
C:/Windows/System32\wbem\tmf
C:/Windows/System32\wbem\eml
C:/Windows/System32\WCN
C:/Windows/System32\WCN\en-US
...

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();
        } 
    } 
}
Запуск примера:
C:\test\test.txt exist.
Creation time: 12/5/2015 7:47:40 PM
Last Write Time 12/5/2015 10:17:29 PM
Directory Name: C:\test
Переименование файла может включать в себя перемещение файла в другой каталог и переименование файла. В случае перемещения файла в другую каталог, нужно убедиться, что этот каталог существует.
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();
        }
    } 
}
Запуск примера:
C:\test\test.txt exist
Please enter a new name for this file:
C:/test2/test2.txt
The file was renamed to C:\test2\test2.txt

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();
        }
    } 
}
Запуск примера:
Creation time: 7/14/2009 10:20:14 AM
Last Write Time 11/21/2010 2:06:51 PM
Directory Name: C:\Windows\System32\drivers
 - Directory: C:\Windowws\System32\drivers\en-US
 - File: C:\Windowws\System32\gm.dls
 - File: C:\Windowws\System32\gmreadme.txt
 - File: C:\Windowws\System32\winmount.sys

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();
        }
    } 
}
Запуск примера:

Pуководства C#

Show More