Как получить полный путь к файлу c
Казалось бы — что может быть проще, чем работа с файлами в C++. Но отдельные личности поражают своей находчивостью в поиске наихудшего подхода.
Не стоит делать так:
How do I get the directory from a file's full path?
What is the simplest way to get the directory that a file is in? I’m using this to set a working directory.
In this example, I should get «C:\MyDirectory».
10 Answers 10
If you’ve definitely got an absolute path, use Path.GetDirectoryName(path) .
If you might only get a relative name, use new FileInfo(path).Directory.FullName .
Note that Path and FileInfo are both found in the namespace System.IO .
You can use System.IO.Path.GetDirectoryName(fileName) , or turn the path into a FileInfo using FileInfo.Directory .
If you’re doing other things with the path, the FileInfo class may have advantages.
You can use Path.GetDirectoryName and just pass in the filename.
If you are working with a FileInfo object, then there is an easy way to extract a string representation of the directory’s full path via the DirectoryName property.
Description of the FileInfo.DirectoryName Property via MSDN:
Gets a string representing the directory’s full path.
Работа с файловой системой в C#. Работа с путями (класс Path)
Путь — это строка, представляющая расположение файла или каталога. При этом, путь не обязательно указывает на физическое расположение чего-либо на диске. Например, путь может быть сопоставлен с расположением в памяти или на другом устройстве. Точный формат пути определяется текущей операционной системой. Так, например, в Windows системах путь может начинаться с буквы диска или тома, а в других операционных системах этот элемент может отсутствовать. В C# работа с путями осуществляется с использованием класса Path из пространства имен System.IO .
Класс Path
Ниже представлены основные методы, свойства и поля класса Path , используемые для работы с путями в C#.
- Поле Alt Directory Separator Char — дополнительный символ, задаваемый платформой, для разделения уровней каталогов в строке пути.
- Поле Directory Separator Char — символ, задаваемый платформой, для разделения уровней папок в строке пути
- Поле Path Separator — разделитель, задаваемый платформой, который используется в переменных среды для разделения строк пути
- Поле Volume Separator Char — предоставляет разделитель томов, задаваемый платформой
- Метод Change Extension(String, String) — изменяет расширение строки пути
- Метод Combine(String[]) — объединяет массив строк в путь
- Метод Ends InDirectory Separator(String) — возвращает значение, указывающее, заканчивается ли заданный путь в разделителе каталогов.
- Метод Get Directory Name(String) — возвращает сведения о каталоге для указанного пути.
- Метод Get Extension(String) — возвращает расширение указанной строки пути (включая точку «.»).
- Метод Get File Name(String) — возвращает имя файла и расширение указанной строки пути
- Метод Get File Name Without Extension(String) — возвращает имя файла указанной строки пути без расширения
- Метод Get Full Path(String) — возвращает для указанной строки пути абсолютный путь
- Метод Get Full Path(String, String) — возвращает абсолютный путь из относительного пути и полного базового пути
- Метод Get Invalid File Name Chars() — возвращает массив, содержащий символы, которые не разрешены в именах файлов
- Метод Get Invalid Path Chars() — возвращает массив, содержащий символы, которые не разрешены в именах путей
- Метод Get Path Root(String) — получает сведения о корневом каталоге из пути, содержащегося в указанной строке
- Метод Get Random File Name() — возвращает произвольное имя каталога или файла
- Метод Get Relative Path(String, String) — возвращает относительный путь от одного пути к другому
- Метод Get Temp File Name() — создает на диске временный пустой файл с уникальным именем и возвращает полный путь этого файла
- Метод Get Temp Path() — возвращает путь к временной папке текущего пользователя
- Метод Has Extension(String) — определяет, включает ли путь расширение имени файла
- Метод Is Path Fully Qualified(String) — возвращает значение, которое показывает, является ли указанный путь к файлу фиксированным для определенного диска или UNC-пути
- Метод Is Path Rooted(String) — возвращает значение, показывающее, содержит ли указанная строка пути корневую папку
- Метод Join(String[]) — сцепляет массив путей в один путь
- Метод Trim Ending Directory Separator(String) — обрезает один конечный разделитель каталогов за пределами корня указанного пути
Следует отметить, что все методы класса Path являются кроссплатформенными, то есть они будут одинаково правильно работать в любой операционной системе.
Как в C# получить разделитель пути, запрещенные символы в путях и именах файлов?
Результат вывода консоли:
Как в C# объединить несколько строк в путь?
Для объединения двух и более строк в путь можно использовать сразу два метода класса Path — это Combine и Join . В отличие от метода Combine , метод Join не пытается получить корень возвращаемого пути. То есть, если любой из путей в paths , за исключением последнего, является абсолютным путем, Join метод не удаляет предыдущие пути, как это делается в методе Combine . Сказанное можно продемонстрировать на следующем примере:
Обратите внимание на третий случай объединения строк в путь — при использовании Join корень пути не был убран. Несмотря на такое поведение метода Join , иногда бывает необходимым его использовать.
Как в C# получить и заменить расширение файла?
Для работы с расширениями файлов в строке пути в классе C# Path используются два метода — Get Extension и Change Extension .
Обратите внимание, что метод GetExtension возвращает расширение вместе с точкой, в то время как для изменения расширения файла в метод ChangeExtension передается расширение без точки.
Как в C# получить имя файла из строки пути?
Для получения имени файла из строки пути в C# могут использоваться два метода класса Path — это Get File Name и Get File Name Without Extension .
Как в C# создать временный файл?
Для создания временного файла в C# может использоваться метод класса Path Get Temp File Name()
Здесь мы создали временный файл во временном каталоге для текущего пользователя и проверили его существование с использованием метода File.Exists . Результат работы программы:
Итого
Сегодня мы разобрались с тем, как в C# устроена работа с путями. Все методы класса Path являются кроссплатформенными, что позволяет использовать их одинаково как в Windows, так и в других операционных системах. Разобрали вопрос того как в C# создать временный файл, соединить несколько строк в путь, получить и изменить расширение файла.
Информация о файлах и каталогах
Классы File и Directory, которые мы использовали в предыдущих главах, отлично подходят для взаимодействия с папками или файлами напрямую. Тем не менее, иногда нам нужно просто получить информацию о них, и опять же, пространство имен System.IO приходит к нам на помощь: классы FileInfo и DirectoryInfo. В этой главе мы посмотрим на несколько способов использования этих двух классов.
Класс FileInfo
Для начала давайте разберемся с простым способом использования класса FileInfo.
Мы создаем новый экземпляр класса FileInfo. Он принимает один параметр — путь к файлу, информацию о котором нам нужно получить. Мы могли бы прописать туда путь к какому-то файлу, однако я подумал, что будет интересно получить информацию об исполняемом файле нашего приложения, над которым мы прямо сейчас работаем — EXE файл нашего проекта после компиляции. Так как мы не имеем доступа к классу Application из консольного приложения (потому что этот класс является частью сборки WinForms), мы используем немного рефлексии для получения пути к текущей сборке. Это выходит за рамки главы, зато вы теперь это знаете.
Теперь у нас есть экземпляр класса FileInfo, мы выведем всю информацию о нем. Попробуйте запустить приложение и вы это увидите. Все легко и просто, и если вы посмотрите на класс FileInfo, вы увидите, что он предлагает даже больше информации, а также ярлыки для методов из File — и почему бы и нет? В любом случае, у нас есть ссылка на файл с экземпляром FileInfo, поэтому мы можем получить те же параметры, что и в классе File.
Класс DirectoryInfo
Информация об одном файле это хорошо, но используя класс DirectoryInfo, мы можем получить информацию обо всех файлах и директориях внутри какой-то определенной директории, что очевидно часто используется в реальных задачах. Давайте я покажу вам простой пример:
Вместо FileInfo, создадим экземпляр DirectoryInfo. Мы используем тот же самый трюк для получения пути к нашему исполняемому файлу, а затем выполним метод GetDirectoryName() из класса Path, чтобы выделить из полного пути только путь к директории. Затем выполним метод GetFiles() для получения массива экземпляров класса FileInfo, каждый из которых представляем файл в директории. После чего переберем их, печатая имя и размер каждого файла.
А если мы захотим в добавок получить и список директорий? Это также легко:
В некоторых ситуациях, нам может понадобиться список файлов или директорий только с определенным именем или расширением файла. К счастью, FileInfo и DirectoryInfo имеют отличное решение и для этой проблемы.
Это выдаст нам все .ехе файлы в директории:
А это выдаст все папки, у которых в имени встречается слово «test»:
Мы даже можем получить и файлы и директории рекурсивно. Это означает, что поиск будет осуществляться и в поддиректориях поддиректории. исходной директории:
Следующим образом будет выглядеть код для поиска только в исходной директории:
Резюме
Мы можем легко получить информацию о файловой системе на нашем компьютере, используя классы FileInfo и DirectoryInfo.