A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
java-cheatsheets / Path.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Cannot retrieve contributors at this time
329 lines (238 sloc) 15.8 KB
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents Copy raw contents
Copy raw contents
Представляет собой абстракцию пути к элементу файловой системы (файлу, каталогу или чему-то ещё). Понятие «файловой системы» здесь можно трактовать достаточно широко, и это не обязательно именно дисковая файловая система. Например, в стандартной библиотеке есть реализация, представляющая ZIP-архив как файловую систему.
Как узнать и скопировать полный путь к файлу или папке Windows 10
Класс Path предназначен только для манипуляции путями как синтаксическими конструкциями, и вовсе не обязательно, что файл (или другой элемент ФС), на который указывает путь, действительно существует. Объект Path проще всего рассматривать как ссылку на элемент ФС, которая сама по себе не умеет работать с тем, на что ссылается. Для операций с самой ФС используется класс Files , принимающий параметры типа Path .
Здесь мы рассмотрим только операции со стандартной ФС.
Чтобы создать объект типа Path с нуля, используется статический метод get в классе Paths :
static Path get(String first, String. more)
Этот метод принимает один и более компонентов пути, разбивает их на отдельные подкомпоненты по платформозависимым разделителям ( / для Unix, для Windows), и из полученных компонентов создаёт объект типа Path .
Например, на платформе Windows все приведённые примеры эквивалентны:
Path p1 = Paths.get(«C:/windows/explorer.exe»); Path p2 = Paths.get(«C:\windows\explorer.exe»); Path p3 = Paths.get(«C:\windows», «explorer.exe»); Path p4 = Paths.get(«C:», «windows», «explorer.exe»);
Обратите внимание, что обратная косая черта должна экранироваться. К сожалению, в Java нет способа отменить экранирование для более короткой записи Windows-путей.
Объекты класса Path являются неизменяемыми. Все операции с путями возвращают новые объекты Path .
У класса Path есть вполне привычный метод toString() , возвращающий представление пути в виде строки, используя системный разделитель компонентов пути.
Path path = Paths.get(«C:\windows\system32»); System.out.println(path); // Или, что то же самое: // System.out.println(path.toString())
C:windowssystem32
Абсолютные и относительные пути
Приведённый выше пример пути является абсолютным путём, потому что он начинается с корня ФС. Абсолютный путь всегда однозначно идентифицирует элемент ФС, независимо от того, какой каталог является текущим каталогом программы.
Как узнать путь к файлу
В Unix абсолютные пути начинаются с косой черты, обозначающей корень файловой системы, а в Windows — с буквы диска. Например, следующие два пути являются абсолютными:
Path unixAbsPath = Paths.get(«/usr/bin/firefox»); Path winAbsPath = Paths.get(«C:\Program Files\Mozilla Firefox\firefox.exe»);
Относительные пути — это пути, ведущие отсчёт от какого-то каталога.
По умолчанию при выполнении операций ФС над относительными путями они разрешаются относительно текущего каталога (current directory), также называемого рабочим каталогом (working directory). Метод toAbsolutePath() позволяет преобразовать относительный путь в абсолютный, при этом он разрешается относительно текущего каталога.
Пусть в каталоге /home/user/java лежит файл AbsolutePath.class , откомпилированный из такого файла:
import java.nio.file.Path; import java.nio.file.Paths; public class AbsolutePath < public static void main(String[] args) < Path relPath = Paths.get(«lib/opencsv.jar»); Path absPath = relPath.
toAbsolutePath(); System.out.println(absPath); > >
Тогда мы получим такой результат при запуске этой программы из командной строки (напомним, что команда cd устанавливает текущий каталог):
$ cd /home/user/java $ java AbsolutePath /home/user/java/lib/opencsv.jar $ cd /tmp $ java -cp /home/user/java AbsolutePath /tmp/lib/opencsv.jar
При задании относительных путей из соображений переносимости нежелательно использовать разделитель путей Windows , если только не известно точно, что программа будет запускаться только под Windows. Windows понимает разделитель путей Unix / , а вот обратное неверно. Ещё правильнее использовать статический метод Paths.get с несколькими параметрами, чтобы не завязываться на конкретный платформозависимый разделитель, а в случае необходимости всё-таки получить этот разделитель в виде строки можно воспользоваться методом FileSystem.getSeparator :
System.out.println(FileSystem.getDefault().getSeparator()); // Печатает / под Unix и под Windows
Для преобразования относительного пути в абсолютный относительно не текущего каталога, а какого-то другого, можно воспользоваться методом resolve . Его нужно вызвать у того пути, относительно которого мы разрешаем относительный путь. У метода resolve есть две версии: одна принимает Path , а вторая принимает String и рассматривает эту строку как путь, который предстоит разрешить.
Path resolve(Path other)
Path resolve(String other)
Path configDir = Paths.get(«/etc»); System.out.println(configDir.resolve(«passwd»)); // /etc/passwd Path apacheConf = Paths.get(«apache2», «apache2.conf»); System.out.println(configDir.
resolve(apacheConf)); // /etc/apache2/apache2.conf
Обратную задачу решает метод relativize , превращающий переданный параметром абсолютный путь в относительный относительно того пути, у которого этот метод вызывается.
Path relativize(Path other)
Path homeDir = Paths.get(«/home/user»); Path movie = Paths.get(«/home/user/Videos/JavaLesson.mkv»); System.out.println(homeDir.
relativize(movie)); // Videos/JavaLesson.mkv
Переход вверх и вниз по иерархии ФС
Метод getParent возвращает родительский элемент ФС (как правило, каталог), или null , если такового не существует.
System.out.println(Paths.get(«C:\windows»).getParent()); // C: System.out.println(Paths.
get(«C:»).getParent()); // null
А метод resolve можно использовать не только для абсолютизации путей, но и для получения пути к какому-либо элементу каталога или какого-то его подкаталога ещё ниже по иерархии ФС:
Paths.get(«C:\windows»).resolve(«explorer.exe») // C:windowsexplorer.exe Paths.get(«C:\windows»).resolve(«system32\user32.dll») // C:windowssystem32user32.dll
Есть также метод resolveSibling , позволяющий получить «сестринский» элемент ФС, то есть разрешающий переданный путь относительно родительского элемента ФС.
Path resolveSibling(Path other)
Path resolveSibling(String other)
Например, он позволяет получить путь к другому файлу в том же каталоге:
Path dll = Paths.get(«C:\windowssystem32\user32.dll») System.out.println(dll.resolveSibling(«kernel32.dll») // C:windowssystem32kernel32.dll
Доступ к компонентам пути
Методы getNameCount и getName позволяют пройтись по всем компонентам пути, представленного объектом Path . Эти компоненты сами имеют тип Path .
Path getName(int index)
Path path = Paths.get(«C:\windowsexplorer.exe»); for (int i = 0; i < path.getNameCount(); i++) < System.out.println(path.getName(i)); >
C: windows explorer.exe
Кроме того, класс Path реализует интерфейс Iterable и, следовательно, поддержку цикла for-each, поэтому то же самое делает и такой код:
for (Path component: path) < System.out.println(component); >
path.forEach(System.
out::println);
Получение имени файла и каталога
Метод getFileName возвращает путь из одного компонента, соответствующего последнему компоненту исходного пути. Обычно это имя файла или другого элемента ФС, на который указывает объект Path . Обратите внимание, что этот метод возвращает Path , а не String .
Paths.get(«/home/user/Pictures/kitty.jpg»).getFileName() // kitty.jpg Paths.get(«C:\gamesWorld of Warcraft»).getFileName() // World of Warcraft
Как мы знаем, получить путь к каталогу, в котором находится файл, можно с помощью getParent :
Paths.get(«/home/user/Pictures/kitty.jpg»).getParent() // /home/user Paths.get(«C:\gamesWorld of Warcraft»).getParent() // C:games
Работа с расширениями
К сожалению, класс Path сам по себе не предоставляет удобных способов работы с расширениями. В некотором смысле это логично, ведь понятие расширения существует только для приложений, работающих с файлами, а для самой ФС это всего лишь часть имени файла. Чтобы отделить расширение, придётся работать с именем файла как со строкой.
Прежде всего эту строку нужно получить:
String fileNameStr = path.getFileName().toString();
После чего работать с расширениями можно обычными строковыми методами:
boolean isPng = fileNameStr.toLowerCase().endsWith(«.png»);
Обратите внимание на вызов toLowerCase . Это гарантирует, что мы проверим имя файла на нужное расширение в любом регистре ( .png , .PNG , .Png и т.д.).
У интерфейса Path тоже есть метод endsWith , но он проверяет, заканчивается ли путь данным компонентом пути, а не заканчивается ли строка имени файла данной строкой. Не путайте!
Paths.get(«/home/user/report.txt»).endsWith(«report.txt») // true Paths.get(«report.txt»).endsWith(«.txt») // false Paths.get(«report.txt»).
toString().endsWith(«.txt») // true
Наконец, можно написать свой метод, который возвращает расширение имени файла или пустую строку, если у имени файла нет расширения:
public String getExtension(Path path) < String fileNameStr = path.getFileName().toString(); int lastDot = fileNameStr.lastIndexOf(‘.’); if (lastDot == -1) < return «»; > else < return fileNameStr.substring(lastDot + 1); > >
Взаимодействие со старыми API
Интерфейс Path появился в Java 7. Старые API, спроектированные для Java 6 и ниже, обычно используют вместо него более старый класс File , существовавший аж в Java 1.0. Он менее удобен, чем Path , потому что поддерживает только стандартную ФС и нарушает принцип единственности ответственности, сочетая в себе методы для синтаксической манипуляции путями и методы доступа к ФС.
Если нужно передать объект Path в старое API, используйте метод toFile :
И, получая объекты File из старого API, преобразуйте их в Path :
К примеру, класс ImageIO , отвечающий за загрузку, сохранение и преобразование изображений, к сожалению, так и не был обновлён для поддержки параметров типа Path . Вот так с помощью ImageIO можно преобразовать любой поддерживаемый формат изображений в формат PNG:
Path source = Paths.get(«/home/user/Pictures/diagram.bmp»); BufferedImage image = ImageIO.read(source.toFile()); Path dest = Paths.get(«/home/user/Pictures/diagram.png»); ImageIO.write(image, «bmp», dest.
toFile());
Источник: github.com
Пути в Windows
Путь к указанному файлу состоит из одного или нескольких компонентов, разделенных специальным символом (обратной косой чертой), причем каждый компонент обычно является именем каталога или именем файла, но с некоторыми заметными исключениями, описанными ниже. Это часто имеет решающее значение для интерпретации системы пути: как выглядит начало или префикс пути. Этот префикс определяет пространство имен, которое использует путь, и, кроме того, какие специальные символы используются в какой позиции в пути, включая последний символ.
Если компонент пути является именем файла, он должен быть последним компонентом.
Каждый компонент пути также будет ограничен максимальной длиной, указанной для определенной файловой системы. В общем, эти правила делятся на две категории: короткие и длинные. Обратите внимание, что имена каталогов хранятся в файловой системе как особый тип файла, но правила именования для файлов также применяются к именам каталогов. Таким образом, путь — это просто строковое представление иерархии между всеми каталогами, которые существуют для конкретного файла или имени каталога.
Полные и относительные пути
Для функций Windows API, которые управляют файлами, имена файлов часто могут быть относительно текущего каталога, в то время как некоторые API требуют полного пути. Имя файла относится к текущему каталогу, если оно не начинается со следующего:
- UNC-имя любого формата, которое всегда начинается с двух символов обратной косой черты («\»).
- Обозначение диска с обратной косой чертой, например » C:»или» d:».
- Одну обратную косую черту, например, «каталог » или «file.txt» Это также называется абсолютным путем.
- «C: tmp.txt » относится к файлу с именем «tmp.txt » в текущем каталоге на диске C.
- «C:tempdirtmp.txt » относится к файлу в подкаталоге к текущему каталогу на диске C.
- «.. tmp.txt » указывает на файл с именем tmp.txt, который расположен в родительском каталоге текущего каталога.
- «…. tmp.txt » указывает на файл, который расположен выше двух каталогов над текущим каталогом.
- «.. tempdirtmp.txt » указывает файл с именем tmp.txt, который находится в каталоге с именем tempdir в том же каталоге текущего каталога.
Максимальное ограничение длины пути
В API-интерфейсе Windows (с некоторыми исключениями, которые будут обсуждаться в следующих параграфах), есть максимальная длина пути в max_path, которая определяется как 260 символов. Локальный путь структурирован в следующем порядке: буква диска, двоеточие, обратная косая черта, компоненты имени, разделенные обратной косой чертой, и завершающий нулевой символ. Например, максимальный путь на диск D «D:some 256-символьный путь строку «, где » » представляет собой невидимый символ NULL для текущей кодовой странице системы. (Символы используются здесь для наглядности и не могут быть частью допустимой строки пути.)
Функции файлового ввода/вывода в Windows API конвертируют «/» в «» в рамках преобразования имени в НТ-имя типа, за исключением случаев использования «\?» префикса.
В Windows API есть множество функций, которые также имеют версии в формате юникода, чтобы разрешить путь расширенной длины для максимальной общей длины пути 32 767 символов. Этот тип пути состоит из компонентов, разделенных обратными косыми чертами, каждый до значения, возвращаемого в параметре Lpmaximumcomponentlength функции GetVolumeInformation (это значение обычно составляет 255 символов). Чтобы указать путь расширенной длины, используйте»\?» префикс. Например?\» ?D:очень_длинный_путь».
Обратите внимание, что максимальный путь 32 767 символов является приблизительным, потому что»\? «префикс может быть расширен до более длинной строки системой во время выполнения, и это расширение применяется к общей длине.
Этот же префикс также можно использовать с путями, построенными в соответствии с универсальным соглашением об именовании (UNC). Чтобы указать такой путь с помощью UNC, используйте»\? UNC». Например?\» ,UNC-путь серверобщий_ресурс», где «сервер» — имя компьютера и » общий_ресурс » — имя общей папки. Эти префиксы не используются как часть самого пути.
Они указывают, что путь должен быть передан системе с минимальным изменением, а это означает, что вы не можете использовать прямые косые черты для представления разделителей пути, или точку для представления текущего каталога, или двойные точки для представления родительского каталога. Так как вы не можете использовать «\? «префикс с относительным путем, относительные пути всегда ограничены в общей сложности числом символов MAX_PATH.
Нет необходимости выполнять какие-либо действия для нормализации юникода в строках путь и имя файла для файла Windows функций API ввода-вывода, поскольку файловая система обрабатывает путь и имена файлов как последовательность значений типа wchar. Любые нормализации, необходимые для вашего приложения должны быть выполнены с учетом этого, внешнего на любые вызовы, связанные с файлом Windows функции API ввода-вывода.
При использовании API для создания каталога указанный путь не может быть таким длинным, что невозможно добавить Имя файла 8.3 (то есть имя каталога не может превышать MAX_PATH минус 12).
Оболочка и файловая система имеют различные требования. Можно создать путь с API Windows, который пользовательский интерфейс оболочки не в состоянии интерпретировать должным образом.
Начиная с Windows 10 версии 1607, ограничения MAX_PATH были удалены из общих Win32 файлов и каталогов функций. Тем не менее необходимо выбрать новое поведение. Рееста позволяет включить или отключить новое поведение длинного пути. Для включения длинных путей установить ключ реестра в
HKLMSYSTEMCurrentControlSetControlFileSystem LongPathsEnabled (Тип: reg_dword).
Значение ключа будет кэшироваться системой (на процесс) после первого вызова файла Win32 или функции каталога .Раздел реестра не будет перезагружен в течение всего срока действия процесса. Для того, чтобы все приложения в системе распознали значение ключа, может потребоваться перезагрузка, потому что некоторые процессы могли начаться до того, как ключ был установлен.
Вы также можете включить новое поведение длинного пути для каждого приложения через манифест:
true
Эти функции управления каталогами, которые не будут иметь ограничения в max_path если вы включите длинные пути: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.

Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
статьи IT, Windows, теория программирования, операционные системы
Источник: upread.ru
Как задать путь к файлу в Python?
![]()
![]()
Для решения задач, связанных с редактированием или чтением файла, необходимо сообщить интерпретатору Python имя нужного нам файла, а также адрес, по которому этот файл располагается. Существуют разные способы указания пути к файлу в Python: от самого простого, до самого правильного. Давайте выясним, чем эти варианты отличаются и почему простой вариант не годится на роль лучшего!