Работа с файловой системой в C#. Работа с путями (класс Path)

Путь — это строка, представляющая расположение файла или каталога. При этом, путь не обязательно указывает на физическое расположение чего-либо на диске. Например, путь может быть сопоставлен с расположением в памяти или на другом устройстве. Точный формат пути определяется текущей операционной системой. Так, например, в Windows системах путь может начинаться с буквы диска или тома, а в других операционных системах этот элемент может отсутствовать. В C# работа с путями осуществляется с использованием класса Path из пространства имен System.IO.

Большинство членов класса Path не взаимодействуют с файловой системой и не проверяют существование файла, указанного в строке пути. Более того, большинство методов Path могут изменять строку пути, но не влияют на имена файлов в файловой системе.

Класс Path

Ниже представлены основные методы, свойства и поля класса Path, используемые для работы с путями в C#.

  • Поле AltDirectorySeparatorChar — дополнительный символ, задаваемый платформой, для разделения уровней каталогов в строке пути.
  • Поле DirectorySeparatorChar — символ, задаваемый платформой, для разделения уровней папок в строке пути
  • Поле PathSeparator — разделитель, задаваемый платформой, который используется в переменных среды для разделения строк пути
  • Поле VolumeSeparatorChar — предоставляет разделитель томов, задаваемый платформой
  • Метод ChangeExtension(String, String) — изменяет расширение строки пути
  • Метод Combine(String[]) — объединяет массив строк в путь
  • Метод EndsInDirectorySeparator(String) — возвращает значение, указывающее, заканчивается ли заданный путь в разделителе каталогов.
  • Метод GetDirectoryName(String) — возвращает сведения о каталоге для указанного пути.
  • Метод GetExtension(String) — возвращает расширение указанной строки пути (включая точку «.»).
  • Метод GetFileName(String) — возвращает имя файла и расширение указанной строки пути
  • Метод GetFileNameWithoutExtension(String) — возвращает имя файла указанной строки пути без расширения
  • Метод GetFullPath(String) — возвращает для указанной строки пути абсолютный путь
  • Метод GetFullPath(String, String) — возвращает абсолютный путь из относительного пути и полного базового пути
  • Метод GetInvalidFileNameChars() — возвращает массив, содержащий символы, которые не разрешены в именах файлов
  • Метод GetInvalidPathChars() — возвращает массив, содержащий символы, которые не разрешены в именах путей
  • Метод GetPathRoot(String) —  получает сведения о корневом каталоге из пути, содержащегося в указанной строке
  • Метод GetRandomFileName() — возвращает произвольное имя каталога или файла
  • Метод GetRelativePath(String, String) — возвращает относительный путь от одного пути к другому
  • Метод GetTempFileName() — создает на диске временный пустой файл с уникальным именем и возвращает полный путь этого файла
  • Метод GetTempPath() — возвращает путь к временной папке текущего пользователя
  • Метод HasExtension(String) — определяет, включает ли путь расширение имени файла
  • Метод IsPathFullyQualified(String) — возвращает значение, которое показывает, является ли указанный путь к файлу фиксированным для определенного диска или UNC-пути
  • Метод IsPathRooted(String) — возвращает значение, показывающее, содержит ли указанная строка пути корневую папку
  • Метод Join(String[]) — сцепляет массив путей в один путь
  • Метод TrimEndingDirectorySeparator(String) — обрезает один конечный разделитель каталогов за пределами корня указанного пути

Следует отметить, что все методы класса Path являются кроссплатформенными, то есть они будут одинаково правильно работать в любой операционной системе.

Как в C# получить разделитель пути, запрещенные символы в путях и именах файлов?

using System;
using System.IO;

namespace FileSystem
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine($"Разделитель уровней папок (DirectorySeparatorChar): {Path.DirectorySeparatorChar}");
                Console.WriteLine($"Дополнительный разделитель уровней папок (AltDirectorySeparatorChar): {Path.AltDirectorySeparatorChar}");
                Console.WriteLine($"Разделитель, который используется в переменных среды для разделения строк пути (PathSeparator): {Path.PathSeparator}");
                Console.WriteLine($"Разделитель томов (VolumeSeparatorChar): {Path.VolumeSeparatorChar}");
                Console.WriteLine($"Символы, запрещенные для использования в пути: {string.Concat(Path.GetInvalidPathChars())}");
                Console.WriteLine($"Симмволы, запрещенные в именах файлов: {string.Concat(Path.GetInvalidFileNameChars())}");

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

Результат вывода консоли:

Разделитель уровней папок (DirectorySeparatorChar): \
Дополнительный разделитель уровней папок (AltDirectorySeparatorChar): /
Разделитель, который используется в переменных среды для разделения строк пути (PathSeparator): ;
Разделитель томов (VolumeSeparatorChar): :
Символы, запрещенные для использования в пути: |☺☻♥♦♣♠►◄↕‼¶§▬↨↑↓→∟↔▲▼
иммволы, запрещенные в именах файлов: «<>|☺☻♥♦♣♠►◄↕‼¶§▬↨↑↓→∟↔▲▼*?\/

Как в C# объединить несколько строк в путь?

Для объединения двух и более строк в путь можно использовать сразу два метода класса Path — это Combine и Join. В отличие от метода Combine, метод Join не пытается получить корень возвращаемого пути. То есть, если любой из путей в paths, за исключением последнего, является абсолютным путем, Join метод не удаляет предыдущие пути, как это делается в методе Combine. Сказанное можно продемонстрировать на следующем примере:

using System;
using System.IO;

namespace FileSystem
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
               ShowPathInformation("C:/", "users/user1/documents", "letters");
               ShowPathInformation("D:/", "/users/user1/documents", "letters");
               ShowPathInformation("D:/", "users/user1/documents", "C:/users/user1/documents/data");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private static void ShowPathInformation(string path1, string path2, string path3)
        {
            Console.WriteLine($"Результат объединения строк  '{path1}', '{path2}', и '{path3}' в путь");
            Console.WriteLine($"   Path.Join:     '{Path.Join(path1, path2, path3)}'");
            Console.WriteLine($"   Path.Combine:  '{Path.Combine(path1, path2, path3)}'");
            Console.WriteLine($"   {Path.GetFullPath(Path.Join(path1, path2, path3))}");
        }
    }
}

Результат работы:

Результат объединения строк ‘C:/’, ‘users/user1/documents’, и ‘letters’ в путь
Path.Join: ‘C:/users/user1/documents\letters’
Path.Combine: ‘C:/users/user1/documents\letters’
C:\users\user1\documents\letters
Результат объединения строк ‘D:/’, ‘/users/user1/documents’, и ‘letters’ в путь
Path.Join: ‘D://users/user1/documents\letters’
Path.Combine: ‘/users/user1/documents\letters’
D:\users\user1\documents\letters
Результат объединения строк ‘D:/’, ‘users/user1/documents’, и ‘C:/users/user1/documents/data’ в путь
Path.Join: ‘D:/users/user1/documents\C:/users/user1/documents/data’
Path.Combine: ‘C:/users/user1/documents/data’
D:\users\user1\documents\C:\users\user1\documents\data

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

Как в C# получить и заменить расширение файла?

Для работы с расширениями файлов в строке пути в классе C# Path используются два метода — GetExtension и ChangeExtension.

try
{
    string path = @"c:\CSharp\Files\test.txt";
    Console.WriteLine($"Исходный путь: {path}");
    Console.WriteLine($"Исходное расширение файла: {Path.GetExtension(path)}");
    Console.WriteLine($"Путь с новым расширением файла: {Path.ChangeExtension(path, "pdf")}");                
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

Результат:

Исходный путь: c:\CSharp\Files\test.txt
Исходное расширение файла: .txt
Путь с новым расширением файла: c:\CSharp\Files\test.pdf

Обратите внимание, что метод GetExtension возвращает расширение вместе с точкой, в то время как для изменения расширения файла в метод ChangeExtension передается расширение без точки.

Как в C# получить имя файла из строки пути?

Для получения имени файла из строки пути в C# могут использоваться два метода класса Path — этоGetFileName и GetFileNameWithoutExtension.

string fullPath = @"C:\Programms\Files\FileName.txt";
string shortPath = @"\Files\FileName.txt";
Console.WriteLine($"Имя файла: {Path.GetFileName(fullPath)}");
Console.WriteLine($"Имя файла: {Path.GetFileNameWithoutExtension(fullPath)}");
Console.WriteLine($"Имя файла из короткого пути: {Path.GetFileName(shortPath)}");
Console.WriteLine($"Имя файла из короткого пути: {Path.GetFileNameWithoutExtension(shortPath)}");

Результат:

Имя файла: FileName.txt
Имя файла: FileName
Имя файла из короткого пути: FileName.txt
Имя файла из короткого пути: FileName

Как в C# создать временный файл?

Для создания временного файла в C# может использоваться метод класса Path  GetTempFileName() 

Console.WriteLine($"Путь к временной папке текущего пользователя: {Path.GetTempPath()}");
Console.WriteLine("Создаем временный файл");
string tmp = Path.GetTempFileName();
Console.WriteLine($"   Путь к временному файлу: {tmp}");
if (File.Exists(tmp))
    Console.WriteLine("Временный файл найден по указанному пути");
else
    Console.WriteLine("Временный файл не найден по указанному пути");

Здесь мы создали временный файл во временном каталоге для текущего пользователя и проверили его существование с использованием метода File.Exists. Результат работы программы:

Путь к временной папке текущего пользователя: C:\Users\user\AppData\Local\Temp\
Создаем временный файл
Путь к временному файлу: C:\Users\user\AppData\Local\Temp\tmpDB08.tmp
Временный файл найден по указанному пути
Обратите внимание на то, что в данном случае метод GetTempFileName именно создает временный файл на диске и возвращает его путь.

Итого

Сегодня мы разобрались с тем, как в C# устроена работа с путями. Все методы класса Path являются кроссплатформенными, что позволяет использовать их одинаково как в Windows, так и в других операционных системах. Разобрали вопрос того как в C# создать временный файл, соединить несколько строк в путь, получить и изменить расширение файла.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии