Какой путь к файлу

Обновлено: 03.07.2024

Файловая система хранит и упорядочивает файлы на каком-либо носителе, как правило, на одном или нескольких жестких дисках, таким образом, чтобы их можно было легко извлечь. Большинство используемых сегодня файловых систем хранят файлы в древовидной (или иерархической) структуре. На вершине дерева находится один (или несколько) корневых узлов. В корневом узле находятся файлы и каталоги (папки в Microsoft Windows). Каждый каталог может содержать файлы и подкаталоги, которые, в свою очередь, могут содержать файлы и подкаталоги и т. д., потенциально до почти безграничной глубины.

В этом разделе рассматриваются следующие вопросы:

Что такое путь?

На следующем рисунке показано примерное дерево каталогов, содержащее один корневой узел. Microsoft Windows поддерживает несколько корневых узлов. Каждый корневой узел сопоставляется с томом, например C:\ или D:\ . ОС Solaris поддерживает один корневой узел, который обозначается косой чертой / .

Пример структуры каталога

Файл идентифицируется по его пути в файловой системе, начиная с корневого узла. Например, файл statusReport на предыдущем рисунке описывается следующей нотацией в ОС Solaris:

В Microsoft Windows отчет о состоянии описывается следующими обозначениями:

Символ, используемый для разделения имен каталогов (также называемый разделителем), зависит от файловой системы: ОС Solaris использует прямую косую черту ( / ), а Microsoft Windows использует обратную косую черту ( \).

Относительно или абсолютно?

Путь может быть относительным или абсолютным. Абсолютный путь всегда содержит корневой элемент и полный список каталогов, необходимых для поиска файла. Например, /home/sally/statusReport — это абсолютный путь. Вся информация, необходимая для поиска файла, содержится в строке пути.

Для доступа к файлу относительный путь необходимо объединить с другим путем. Например, joe/foo — это относительный путь. Без дополнительной информации программа не сможет надежно найти каталог joe/foo в файловой системе.

Символические ссылки

Объекты файловой системы чаще всего представляют собой каталоги или файлы. С этими предметами знаком каждый. Но некоторые файловые системы также поддерживают символические ссылки. Символическая ссылка также называется символической ссылкой или мягкой ссылкой.

символическая ссылка — это специальный файл, который служит ссылкой на другой файл. По большей части символические ссылки прозрачны для приложений, и операции с символическими ссылками автоматически перенаправляются к цели ссылки. (Файл или каталог, на который указывает ссылка, называется целью ссылки.) Исключения составляют случаи, когда символическая ссылка удаляется или переименовывается, и в этом случае удаляется или переименовывается сама ссылка, а не цель. ссылки.

На следующем рисунке logFile кажется пользователю обычным файлом, но на самом деле это символическая ссылка на каталог dir/logs/HomeLogFile . HomeLogFile является целью ссылки.

Пример символической ссылки.

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

Фраза разрешение ссылки означает замену символической ссылки фактическим местоположением в файловой системе. В этом примере разрешение logFile дает dir/logs/HomeLogFile .

В реальных сценариях большинство файловых систем широко используют символические ссылки. Иногда небрежно созданная символическая ссылка может привести к циклической ссылке. Циклическая ссылка возникает, когда цель ссылки указывает на исходную ссылку. Циклическая ссылка может быть косвенной: каталог a указывает на каталог b, который указывает на каталог c, содержащий подкаталог, указывающий обратно на каталог a. Циклические ссылки могут вызвать хаос, когда программа рекурсивно перемещается по структуре каталогов. Однако этот сценарий был учтен и не приведет к бесконечному циклу вашей программы.

На следующей странице обсуждается сердцевина файлового ввода-вывода в языке программирования Java — класс Path.

Путь к файлу описывает расположение файла в структуре папок веб-сайта.

Примеры пути к файлу

ПутьОписание

Файл "picture.jpg" находится в той же папке, что и текущая страница

Файл "picture.jpg" находится в папке images в текущей папке

Файл "picture.jpg" находится в папке с изображениями в корне текущей сети

Файл "picture.jpg" находится в папке на один уровень выше текущей папки

Пути к файлам HTML

Путь к файлу описывает расположение файла в структуре папок веб-сайта.

Пути к файлам используются при создании ссылок на внешние файлы, например:

  • Веб-страницы
  • Изображения
  • Таблицы стилей
  • JavaScripts

Абсолютные пути к файлам

Абсолютный путь к файлу — это полный URL-адрес файла:

Пример

Гора

Тег описан в главе "Изображения HTML".

Относительные пути к файлам

Относительный путь к файлу указывает на файл относительно текущей страницы.

В следующем примере путь к файлу указывает на файл в папке с изображениями, расположенной в корневом каталоге текущего веб-сайта:

Пример

Гора

В следующем примере путь к файлу указывает на файл в папке с изображениями, расположенной в текущей папке:

Пример

Гора

В следующем примере путь к файлу указывает на файл в папке с изображениями, расположенной в папке на один уровень выше текущей папки:

Пример

Гора

Рекомендации

Рекомендуется использовать относительные пути к файлам (если это возможно).

При использовании относительных путей к файлам ваши веб-страницы не будут привязаны к вашему текущему базовому URL. Все ссылки будут работать на вашем собственном компьютере (localhost), а также на вашем текущем общедоступном домене и ваших будущих общедоступных доменах.

Члены многих типов в пространстве имен System.IO включают параметр пути, который позволяет указать абсолютный или относительный путь к ресурсу файловой системы. Затем этот путь передается API-интерфейсам файловой системы Windows. В этом разделе обсуждаются форматы путей к файлам, которые можно использовать в системах Windows.

Традиционные пути DOS

Стандартный путь DOS может состоять из трех компонентов:

  • Буква тома или диска, за которой следует разделитель томов ( : ).
  • Имя каталога. Символ разделителя каталогов разделяет подкаталоги во вложенной иерархии каталогов.
  • Необязательное имя файла. Символ разделителя каталогов разделяет путь к файлу и имя файла.

Если присутствуют все три компонента, путь является абсолютным. Если буква тома или диска не указана, а имя каталога начинается с символа разделителя каталогов, путь является относительным от корня текущего диска. В противном случае путь указывается относительно текущего каталога. В следующей таблице показаны некоторые возможные пути к каталогам и файлам.

< td>Абсолютный путь от корня текущего диска.
Путь Описание
C:\Documents\Newsletters\Summer2018 .pdf Абсолютный путь к файлу от корня диска C: .
\Program Files\Custom Utilities\StringFinder.exe
2018\January.xlsx Относительный путь к файлу в подкаталоге текущий каталог.
..\Publications\TravelBrochure.pdf Относительный путь к файлу в каталоге, начиная с текущего каталога.
C:\Projects\apilibrary\apilibrary.sln Абсолютный путь к файлу из корня диска C: .
C:Projects\apilibrary\apilibrary.sln Относительный путь от текущего каталога диска C:.

Обратите внимание на разницу между двумя последними путями. Оба указывают необязательный спецификатор тома ( C: в обоих случаях), но первый начинается с корня указанного тома, а второй — нет. В результате первый — это абсолютный путь от корневого каталога диска C:, а второй — относительный путь от текущего каталога диска C:. Использование второй формы вместо первой является частым источником ошибок, связанных с путями к файлам Windows.

Вы можете определить, является ли путь к файлу полным (т. е. не зависит ли путь от текущего каталога и не изменяется при изменении текущего каталога), вызвав метод Path.IsPathFullyQualified. Обратите внимание, что такой путь может включать сегменты относительных каталогов ( . и .. ) и по-прежнему быть полным, если разрешенный путь всегда указывает на одно и то же место.

В следующем примере показана разница между абсолютным и относительным путями. Предполагается, что каталог D:\FY2018\ существует и что вы не задали текущий каталог для D:\ из командной строки перед запуском примера.

Если вы хотите, чтобы комментарии к коду были переведены на языки, отличные от английского, сообщите нам об этом в этом обсуждении на GitHub.

UNC-пути

Пути универсального соглашения об именах (UNC), которые используются для доступа к сетевым ресурсам, имеют следующий формат:

  • Имя сервера или хоста, перед которым стоит \\ . Имя сервера может быть именем компьютера NetBIOS или IP/FQDN-адресом (поддерживаются как IPv4, так и v6).
  • Имя общего ресурса, которое отделяется от имени хоста символом \ . Вместе имя сервера и общего ресурса составляют том.
  • Имя каталога. Символ разделителя каталогов разделяет подкаталоги во вложенной иерархии каталогов.
  • Необязательное имя файла. Символ разделителя каталогов разделяет путь к файлу и имя файла.

Ниже приведены некоторые примеры путей UNC:

Путь Описание
\\system07\C$\< /td> Корневой каталог диска C: в system07 .
\\Server2\Share\Test\Foo.txt Foo.txt в тестовом каталоге тома \\Server2\Share.

Пути UNC всегда должны быть полностью определенными. Они могут включать сегменты относительных каталогов ( . и .. ), но они должны быть частью полного пути. Относительные пути можно использовать только путем сопоставления пути UNC с буквой диска.

Пути устройств DOS

Операционная система Windows имеет единую объектную модель, которая указывает на все ресурсы, включая файлы. Эти пути к объектам доступны из окна консоли и отображаются на уровне Win32 через специальную папку символических ссылок, с которыми сопоставляются устаревшие пути DOS и UNC. Доступ к этой специальной папке осуществляется с помощью синтаксиса пути устройства DOS, который может быть одним из следующих:

Помимо идентификации диска по его букве, вы можете идентифицировать том по его GUID. Это принимает форму:

Путь устройства DOS состоит из следующих компонентов:

Спецификатор пути к устройству ( \\.\ или \\?\ ), который идентифицирует путь как путь к устройству DOS.

Символическая ссылка на «реальный» объект устройства (C: в случае имени диска или Volume в случае GUID тома).

Первый сегмент пути устройства DOS после спецификатора пути устройства идентифицирует том или диск. (Например, \\?\C:\ и \\.\BootPartition\ .)

Существует специальная ссылка для UNC, которая, что неудивительно, называется UNC . Например:

Для UNC устройств часть сервера/общего ресурса образует том. Например, в \\?\server1\e:\utilities\\filecomparer\ часть server/share — это server1\utilities . Это важно при вызове такого метода, как Path.GetFullPath(String, String) с относительными сегментами каталога; невозможно пройти мимо тома.

Пути устройств DOS являются полными по определению и не могут начинаться с сегмента относительного каталога ( . или .. ). Текущие каталоги никогда не входят в их использование.

Пример: способы ссылки на один и тот же файл

В следующем примере показаны некоторые способы обращения к файлу при использовании API в пространстве имен System.IO. В примере создается экземпляр объекта FileInfo и используются его свойства Name и Length для отображения имени файла и длины файла.

Нормализация пути

Почти все пути, передаваемые API Windows, нормализованы. Во время нормализации Windows выполняет следующие шаги:

  • Определяет путь.
  • Применяет текущий каталог к ​​частично определенным (относительным) путям.
  • Канонизирует разделители компонентов и каталогов.
  • Вычисляет относительные компоненты каталога ( . для текущего каталога и .. для родительского каталога).
  • Удаляет определенные символы.

Эта нормализация происходит неявно, но вы можете сделать это явно, вызвав метод Path.GetFullPath, который заключает в себе вызов функции GetFullPathName(). Вы также можете вызвать функцию Windows GetFullPathName() напрямую, используя P/Invoke.

Определить путь

Первым шагом в нормализации пути является определение типа пути. Пути относятся к одной из нескольких категорий:

  • Это пути к устройствам; то есть они начинаются с двух разделителей и вопросительного знака или точки ( \\? или \\. ).
  • Это пути UNC; то есть они начинаются с двух разделителей без знака вопроса или точки.
  • Это полностью определенные пути DOS; то есть они начинаются с буквы диска, разделителя тома и разделителя компонентов ( C:\ ).
  • Они обозначают устаревшее устройство ( CON , LPT1 ).
  • Они относятся к корню текущего диска; то есть они начинаются с одного разделителя компонентов ( \ ).
  • Они относятся к текущему каталогу указанного диска; то есть они начинаются с буквы диска, разделителя томов и без разделителя компонентов ( C: ).
  • Они относятся к текущему каталогу; то есть они начинаются с чего-то еще ( temp\testfile.txt ).

Тип пути определяет, применяется ли каким-либо образом текущий каталог. Он также определяет, что является «корнем» пути.

Обработка устаревших устройств

Если путь представляет собой устаревшее устройство DOS, такое как CON , COM1 или LPT1 , он преобразуется в путь устройства путем добавления \\.\ и возврата.

Путь, начинающийся с имени устаревшего устройства, всегда интерпретируется методом Path.GetFullPath(String) как устаревшее устройство. Например, путь устройства DOS для CON.TXT — \\.\CON , а путь устройства DOS для COM1.TXT\file1.txt — \\.\COM1 .

Применить текущий каталог

Если путь не указан полностью, Windows применяет к нему текущий каталог. К UNC и путям устройств не применяется текущий каталог. Не работает и полный диск с разделителем C:\ .

Если путь начинается с одного разделителя компонентов, применяется диск из текущего каталога. Например, если путь к файлу — \utilities, а текущий каталог — C:\temp\ , нормализация дает C:\utilities .

Если путь начинается с буквы диска, разделителя томов и без разделителя компонентов, применяется последний текущий каталог, заданный в командной оболочке для указанного диска. Если последний текущий каталог не был установлен, применяется только диск. Например, если путь к файлу — D:sources, текущий каталог — C:\Documents\, а последний текущий каталог на диске D: — D:\sources\, результатом будет D:\sources\sources. Эти «относительные» пути являются распространенным источником логических ошибок программ и сценариев. Предполагать, что путь, начинающийся с буквы и двоеточия, не является относительным, явно неверно.

Если путь начинается не с разделителя, применяются текущий диск и текущий каталог. Например, если путь — filecompare, а текущий каталог — C:\utilities\ , результатом будет C:\utilities\filecompare\ .

Канонизировать разделители

Все прямые косые черты ( / ) преобразуются в стандартный разделитель Windows — обратную косую черту ( \ ). Если они присутствуют, ряд косых черт, следующих за первыми двумя косыми чертами, сворачивается в одну косую черту.

Оценить относительные компоненты

По мере обработки пути оцениваются любые компоненты или сегменты, состоящие из одной или двух точек ( . или .. ):

На один период текущий сегмент удаляется, так как он ссылается на текущий каталог.

Для двойной точки текущий сегмент и родительский сегмент удаляются, поскольку двойная точка относится к родительскому каталогу.

Родительские каталоги удаляются только в том случае, если они не находятся за корнем пути. Корень пути зависит от типа пути. Это диск ( C:\ ) для путей DOS, сервер/общий ресурс для UNC ( \\Server\Share ) и префикс пути к устройству для путей к устройствам ( \\?\ или \\.\ ).

Обрезать символы

Помимо удаленных ранее серий разделителей и относительных сегментов, при нормализации удаляются некоторые дополнительные символы:

Если сегмент заканчивается одним периодом, этот период удаляется. (Сегмент из одной или двух точек нормализуется на предыдущем шаге. Сегмент из трех и более точек не нормализуется и фактически является допустимым именем файла/каталога.)

Если путь не заканчивается разделителем, все завершающие точки и пробелы (U+0020) удаляются. Если последний сегмент представляет собой просто одинарную или двойную точку, он подпадает под действие приведенного выше правила относительных компонентов.

Это правило означает, что вы можете создать имя каталога с завершающим пробелом, добавив завершающий разделитель после пробела.

Вы никогда не должны создавать каталог или имя файла с пробелом в конце. Конечные пробелы могут затруднить или сделать невозможным доступ к каталогу, и приложения обычно не работают при попытке обработать каталоги или файлы, имена которых содержат конечные пробелы.

Пропустить нормализацию

Обычно любой путь, переданный API Windows, (фактически) передается функции GetFullPathName и нормализуется. Есть одно важное исключение: путь к устройству начинается со знака вопроса, а не с точки. Если путь не начинается точно с \\?\ (обратите внимание на использование канонической обратной косой черты), он нормализуется.

Почему вы хотите пропустить нормализацию? Есть три основные причины:

Чтобы получить доступ к путям, которые обычно недоступны, но разрешены. Файл или каталог, называемый скрытым. , например, невозможно получить доступ каким-либо другим способом.

Чтобы повысить производительность, пропустив нормализацию, если она уже была выполнена.

Пропуск проверки нормализации и максимального пути — единственное различие между двумя синтаксисами пути к устройству; в остальном они идентичны. Будьте осторожны, пропуская нормализацию, так как вы можете легко создать пути, с которыми "обычным" приложениям будет сложно работать.

Пути, начинающиеся с \\?\, по-прежнему нормализуются, если вы явно передаете их функции GetFullPathName.

Вы можете передавать пути, содержащие более MAX_PATH символов, в GetFullPathName без \\?\ . Он поддерживает пути произвольной длины вплоть до максимального размера строки, который может обрабатывать Windows.

Case и файловая система Windows

Особенность файловой системы Windows, которая сбивает с толку пользователей и разработчиков, отличных от Windows, заключается в том, что в именах путей и каталогов не учитывается регистр. То есть имена каталогов и файлов отражают регистр строк, используемых при их создании. Например, вызов метода

Путь может относиться к любому из следующего:

<р>1. Также известный как имя пути, текущий путь или путь — это полное местоположение или имя, где находится компьютер, файл, устройство или веб-страница. Ниже приведены примеры различных типов путей, связанных с компьютером.

Путь MS-DOS

В следующем примере показан путь MS-DOS или путь к файлу system.ini. При работе с путем из командной строки MS-DOS, Windows или Windows все диски (корень), каталоги и файлы разделяются обратной косой чертой.

Путь Linux и Apple

В Linux или оболочке Apple с помощью команды pwd ваш путь может выглядеть так, как показано в следующем примере. При работе с этим типом пути диски, каталоги и файлы разделяются косой чертой.

Сетевой путь

Сетевой путь — это путь к общему ресурсу. В приведенном ниже примере «помощь» — это общий ресурс на «надежном» компьютере.

Интернет-путь

В следующем примере показан Интернет-путь или URL-адрес (унифицированный указатель ресурсов) этой веб-страницы в Интернете.

Как отобразить текущий путь?

По умолчанию MS-DOS и командная строка Windows отображают в приглашении полный текущий путь. Например, если приглашение — C:\Windows\System32>, то путь — c:\Windows\System32. В Linux у вас может быть только частичный путь. Например, в приглашении может быть "~/public_html/cgi-bin". ~ (тильда) — это сокращение, используемое для обозначения вашего домашнего каталога.

Чтобы отобразить текущий путь в MS-DOS или командной строке Windows, введите в командной строке chdir. В Linux введите pwd в приглашении, чтобы распечатать рабочий каталог (путь).

  • Дополнительную информацию об этой команде см. на странице команды chdir.
  • Для получения дополнительной информации и примеров по этой команде см. команду pwd.

Дополнительная информация

<р>2. Path — это социальная сеть, основанная в 2010 году и предназначенная исключительно для мобильных устройств. Он позволяет вам подключать самых близких друзей и членов семьи, до 150 подключений.

<р>3. В векторной графике путь — это другое название вектора или линии с начальной и конечной точками.

<р>4. В компьютерных играх и других трехмерных средах путь — это линия, по которой объекты перемещаются из одной точки в другую. Например, в компьютерной игре NPC (неигровой персонаж) может следовать заданному пути, чтобы создать иллюзию живого персонажа. Чтобы помочь этому персонажу обходить препятствия, которые могут помешать его пути, может использоваться алгоритм, подобный алгоритму A*.

Читайте также: