Члены большинства типов в пространстве имен System.IO имеют параметр path , который позволяет указать абсолютный или относительный путь к ресурсу в файловой системе. Этот путь передается в API файловой системы Windows. В этом разделе рассматриваются форматы путей к файлам, которые можно использовать в операционных системах Windows.
Традиционные пути DOS
Стандартный путь DOS может состоять из трех компонентов:
- Буква тома или диска, после которой следует разделитель томов ( : ).
- Имя каталога. Символ разделителя каталогов служит для разделения подкаталогов во внутренней иерархии каталога.
- Необязательное имя файла. Символ разделителя каталогов служит для разделения пути к файлу и его имени.
Если присутствуют все три компонента, путь является абсолютным. Если буква тома или диска не указана и имя каталога начинается с символа разделителя каталогов, такой путь задан относительно корня текущего диска. В противном случае путь задан относительно текущего каталога. В следующей таблице показаны некоторые возможные пути к каталогам и файлам.
Как узнать и скопировать полный путь к файлу или папке Windows 10
Обратите внимание на различия между двумя последними путями. В обоих случаях задается необязательный описатель тома ( C: ), однако первый путь, в отличие от второго, начинается с корня указанного тома. В результате первый путь является абсолютным из корневого каталога диска C: , тогда как второй — относительным из текущего каталога C: . Использование второй формы пути в тех случаях, когда предполагается наличие первой, является распространенным источником ошибок, связанных с путями к файлам в Windows.
Можно определить, является ли путь к файлу полным (то есть, если путь не зависит от текущего каталога и не изменяется при изменении текущего Path.IsPathFullyQualified каталога), вызвав метод . Обратите внимание, что такой путь может включать сегменты с относительным путем к каталогу ( . и .. ), но при этом по-прежнему будет полным, если разрешенный путь всегда указывает на одно и то же место.
В приведенном ниже примере показано различие между абсолютными и относительными путями. Предполагается, что каталог D:FY2018 существует и вы не установили какой-либо текущий каталог для диска D: из командной строки перед запуском этого примера.
Imports System.Diagnostics Imports System.IO Imports System.Reflection Public Module Example Public Sub Main(args() As String) Console.WriteLine($»Current directory is »») Console.WriteLine(«Setting current directory to ‘C:'») Directory.SetCurrentDirectory(«C:») Dim filePath As String = Path.GetFullPath(«D:FY2018») Console.WriteLine($»‘D:\FY2018’ resolves to «) filePath = Path.GetFullPath(«D:FY2018») Console.WriteLine($»‘D:FY2018’ resolves to «) Console.WriteLine(«Setting current directory to ‘D:\Docs'») Directory.SetCurrentDirectory(«D:Docs») filePath = Path.GetFullPath(«D:FY2018») Console.WriteLine($»‘D:\FY2018’ resolves to «) filePath = Path.GetFullPath(«D:FY2018») ‘ This will be «D:DocsFY2018» as it happens to match the drive of the current directory Console.WriteLine($»‘D:FY2018’ resolves to «) Console.WriteLine(«Setting current directory to ‘C:\'») Directory.SetCurrentDirectory(«C:») filePath = Path.GetFullPath(«D:FY2018») Console.WriteLine($»‘D:\FY2018’ resolves to «) ‘ This will be either «D:FY2018» or «D:FY2018FY2018» in the subprocess. In the sub process, ‘ the command prompt set the current directory before launch of our application, which ‘ sets a hidden environment variable that is considered. filePath = Path.GetFullPath(«D:FY2018») Console.WriteLine($»‘D:FY2018’ resolves to «) If args.Length < 1 Then Console.WriteLine(«Launching again, after setting current directory to D:FY2018») Dim currentExe As New Uri(Assembly.GetExecutingAssembly().GetName().CodeBase, UriKind.Absolute) Dim commandLine As String = $»/C cd D:FY2018 «»» stop» Dim psi As New ProcessStartInfo(«cmd», commandLine) Process.Start(psi).WaitForExit() Console.WriteLine(«Sub process returned:») filePath = Path.GetFullPath(«D:FY2018») Console.WriteLine($»‘D:\FY2018’ resolves to «) filePath = Path.GetFullPath(«D:FY2018») Console.WriteLine($»‘D:FY2018’ resolves to «) End If Console.WriteLine(«Press any key to continue. «) Console.ReadKey() End Sub End Module ‘ The example displays the following output: ‘ Current directory is ‘C:Programsfile-paths’ ‘ Setting current directory to ‘C:’ ‘ ‘D:FY2018’ resolves to D:FY2018 ‘ ‘D:FY2018’ resolves to d:FY2018 ‘ Setting current directory to ‘D:Docs’ ‘ ‘D:FY2018’ resolves to D:FY2018 ‘ ‘D:FY2018’ resolves to D:DocsFY2018 ‘ Setting current directory to ‘C:’ ‘ ‘D:FY2018’ resolves to D:FY2018 ‘ ‘D:FY2018’ resolves to d:FY2018 ‘ Launching again, after setting current directory to D:FY2018 ‘ Sub process returned: ‘ ‘D:FY2018’ resolves to D:FY2018 ‘ ‘D:FY2018’ resolves to d:FY2018 ‘ The subprocess displays the following output: ‘ Current directory is ‘C:’ ‘ Setting current directory to ‘C:’ ‘ ‘D:FY2018’ resolves to D:FY2018 ‘ ‘D:FY2018’ resolves to D:FY2018FY2018 ‘ Setting current directory to ‘D:Docs’ ‘ ‘D:FY2018’ resolves to D:FY2018 ‘ ‘D:FY2018’ resolves to D:DocsFY2018 ‘ Setting current directory to ‘C:’ ‘ ‘D:FY2018’ resolves to D:FY2018 ‘ ‘D:FY2018’ resolves to D:FY2018FY2018
UNC-пути
UNC-пути (универсальное соглашение об именовании) используются для доступа к сетевым ресурсам и имеют следующий формат:
Как найти путь к файлу или папке программы
- Имя сервера или узла, которому предшествуют символы \ . В качестве имени сервера может выступать имя компьютера NetBIOS, а также IP-адрес или полное доменное имя (поддерживаются адреса IPv4 и IPv6).
- Имя общего ресурса, которое отделяется от имени узла символами . Имя сервера и имя общего ресурса в совокупности образуют том.
- Имя каталога. Символ разделителя каталогов служит для разделения подкаталогов во внутренней иерархии каталога.
- Необязательное имя файла. Символ разделителя каталогов служит для разделения пути к файлу и его имени.
Ниже приводятся некоторые примеры UNC-путей:
\system07C$ | Корневой каталог диска C: на компьютере system07 . |
\Server2ShareTestFoo.txt | Файл Foo.txt в тестовом каталоге тома \Server2Share . |
UNC-пути всегда должны быть полными. Они могут включать сегменты с относительным путем к каталогу ( . и .. ), однако они должны быть частью полного пути. Использовать относительные пути можно только посредством сопоставления UNC-пути с буквой диска.
Пути к устройствам DOS
В операционной системе Windows используется унифицированная объектная модель, которая указывает на все ресурсы, включая файлы. Эти пути к объектам доступны из окна консоли и предоставляются на уровень Win32 с использованием специальной папки с символьными ссылками, с которыми сопоставляются устаревшие пути DOS и UNC. Доступ к этой специальной папке осуществляется с использованием синтаксиса пути к устройству DOS, который может иметь одну из приведенных ниже форм:
Помимо использования буквы диска, вы можете указать том с помощью его GUID. Синтаксис будет иметь вид:
Синтаксис пути к устройству DOS поддерживается в реализациях платформы .NET для ОС Windows, начиная с версий .NET Core 1.1 и .NET Framework 4.6.2.
Путь к устройству DOS состоит из следующих компонентов:
-
Описатель пути к устройству ( \. или \? ), который идентифицирует путь как путь к устройству DOS.
Примечание Описатель \? поддерживается во всех версиях .NET Core, в .NET 5 и более поздних версий, а также в .NET Framework, начиная с версии 4.6.2.
Пути устройств DOS являются полными по определению и не могут начинаться с относительного сегмента каталога ( . или .. ). Они никогда не задаются относительно текущего каталога.
Пример. Способы задать ссылку на один и тот же файл
В следующем примере демонстрируются некоторые способы задать ссылку на файл с использованием API в пространстве имен System.IO. В этом примере создается экземпляр объекта FileInfo и используются его свойства Name и Length, чтобы отобразить имя и длину файла.
Imports System.IO Module Program Sub Main() Dim filenames() As String = < «c:temptest-file.txt», «\127.0.0.1c$temptest-file.txt», «\LOCALHOSTc$temptest-file.txt», «\.c:temptest-file.txt», «\?c:temptest-file.txt», «\.UNCLOCALHOSTc$temptest-file.txt», «\127.0.0.1c$temptest-file.txt»>For Each filename In filenames Dim fi As New FileInfo(filename) Console.WriteLine($»file : bytes») Next End Sub End Module
Нормализация путей
Практически все передаваемые в API Windows пути нормализуются. При нормализации в Windows выполняются следующие действия:
- Идентифицируется путь.
- Текущий каталог применяется к неполным (относительным) путям.
- Выполняется канонизация разделителей каталогов.
- Вычисляются относительные компоненты каталога ( . для текущего и .. для родительского каталога).
- Удаляются некоторые символы.
Эта нормализация происходит неявно, но это можно сделать явным образом, вызвав Path.GetFullPath метод , который заключает в оболочку вызов функции GetFullPathName(). Также можно вызвать функцию GetFullPathName() Windows напрямую с помощью P/Invoke.
Идентификация пути
На первом шаге процесса нормализации осуществляется идентификация типа пути. Пути могут относиться к одной из нескольких категорий:
- Пути к устройствам: начинаются с двух разделителей и знака вопроса или точки ( \? или \. ).
- UNC-пути: начинаются с двух разделителей без знака вопроса или точки.
- Полные пути DOS: начинаются с буквы диска, разделителя томов и компонентов ( C: ).
- Пути к устаревшим устройствам ( CON , LPT1 ).
- Пути относительно корня текущего диска: начинаются с одного разделителя компонентов ( ).
- Пути относительно текущего каталога указанного диска: начинаются с буквы диска и разделителя томов, но не содержат разделителя компонентов ( C: ).
- Пути относительно текущего каталога: начинаются с любых других символов ( temptestfile.txt ).
Тип пути определяет, будет ли каким-либо образом применяться текущий каталог. Кроме того, от типа пути зависит применяемый корень.
Работа с устаревшими устройствами
Если путь указывает на устаревшее устройство DOS, например CON , COM1 или LPT1 , он преобразуется в путь к устройству путем добавления перед ним последовательности \. и возвращается в таком виде.
Путь, который начинается с имени устаревшего устройства, всегда интерпретируется как путь к устаревшему устройству с помощью метода Path.GetFullPath(String). Например, путь к устройству DOS CON.TXT будет выглядеть как \.CON , а путь к устройству DOS COM1.TXTfile1.txt будет выглядеть как \.COM1 .
Применение текущего каталога
Если путь не является полным, система Windows применяет к нему текущий каталог. К UNC-путям и путям к устройствам текущий каталог не применяется. Также текущий каталог не применяется к полным путям к диску с разделителем C: .
Если путь начинается с одного разделителя компонентов, применяется диск текущего каталога. Например, для пути к файлу utilities и текущего каталога C:temp в результате нормализации будет получен путь C:utilities .
Если путь начинается с буквы диска, разделителя томов и не содержит разделителя компонентов, применяется последний текущий каталог, установленный из командной оболочки. Если последний текущий каталог не был установлен, применяется диск сам по себе. Например, для пути D:sources , текущего каталога C:Documents и последнего текущего каталога D:sources на диске D: в результате будет получен путь D:sourcessources . Пути, задаваемые относительно диска, являются распространенными источниками ошибок программ и логики скрипта. Предположение, что путь, начинающийся с буквы и двоеточия, не является относительным, очевидно неверно.
Если путь не начинается с разделителя, применяются текущий диск и текущий каталог. Например, для пути к файлу filecompare и текущего каталога C:utilities в результате будет получен путь C:utilitiesfilecompare .
Применение относительных путей в многопотоковых приложениях (то есть в большинстве приложений) сопряжено с определенными рисками, поскольку текущий каталог задается на уровне процесса. Таким образом, любой поток может в любое время изменить текущий каталог. Начиная с версии .NET Core 2.1, вы можете вызвать метод Path.GetFullPath(String, String) для получения абсолютного пути на основе относительного и базового (текущий каталог) путей, относительно которых требуется выполнить разрешение.
Канонизация разделителей
Все символы косой черты ( / ) преобразуются в стандартные разделители Windows, то есть символы обратной косой черты ( ). Если они присутствуют, последовательность символов косой черты после первых двух таких символов свертывается в один символ косой черты.
Вычисление относительных компонентов
При обработке пути выполняется вычисление любых его компонентов или сегментов, которые состоят из одной или двух точек ( . или .. ):
- Если обнаруживается одна точка, текущий сегмент удаляется, поскольку он ссылается на текущий каталог.
- Если обнаруживаются две точки, удаляются текущий и родительский сегмент, поскольку в этом случае задается ссылка на родительский каталог. Родительские каталоги удаляются только в том случае, если они не находятся после корня пути. Корень пути зависит от его типа. Это будет диск ( C: ) для путей DOS, сервер или общий сетевой ресурс для UNC-путей ( \ServerShare ) и префикс пути к устройству для путей к устройствам ( \? или \. ).
Удаление знаков
Помимо удаленных ранее разделителей и относительных сегментов во время нормализации также удаляются некоторые дополнительные знаки:
- Если сегмент заканчивается одной точкой, эта точка удаляется. (Сегмент одного или двойного периода нормализуется на предыдущем шаге. Сегмент из трех или более точек не нормализуется и фактически является допустимым именем файла или каталога.)
- Если путь не заканчивается разделителем, удаляются все конечные точки и пробелы (U+0020). Если последний сегмент содержит только одну или две точки, к нему применяется приведенное выше правило для относительных компонентов. Это правило устанавливает, что вы можете создать имя каталога с конечным пробелом, добавив разделитель после пробела.
Важно! Создавать имена каталогов или файлов с конечным пробелом нельзя. Наличие конечных пробелов может затруднить или исключить возможность доступа к каталогу. В связи с этим при попытке обработать каталоги или файлы, имена которых содержат конечные пробелы, происходит сбой приложения.
Пропуск нормализации
Как правило, любой путь, передаваемый в API Windows передается в функцию GetFullPathName и нормализуется. Существует одно важное исключение: путь к устройству, который начинается со знака вопроса, а не с точки. Если путь не начинается с последовательности \? (обратите внимание на использование канонической формы с обратной косой чертой), он нормализуется.
Зачем нужно пропускать нормализацию? Существует три основных причины:
- Получение путей, которые в обычных обстоятельствах недоступны, но являются допустимыми. Например, невозможно каким-либо иным способом получить доступ к файлу или каталогу с именем hidden. .
- Повышение производительности за счет пропуска нормализации в тех случаях, когда нормализация уже выполнена.
- Только на платформе .NET Framework пропуск проверки длины пути MAX_PATH для использования путей длиной более 259 символов. Такое поведение допускается в большинстве API за некоторыми исключениями.
.NET Core и .NET 5 или более поздней версии обрабатывают длинные пути неявным образом и не выполняют проверку MAX_PATH . Проверка MAX_PATH применяется только для платформы .NET Framework.
Пропуск нормализации и проверки максимальной длины пути является единственным отличием между двумя видами синтаксиса путей к устройствам. В остальных аспектах они идентичны. Пропуск нормализации следует использовать с осторожностью, поскольку в этом случае легко получить пути, при работе с которыми в обычных приложениях будут возникать трудности.
Пути, начинающиеся с последовательности \? , по-прежнему нормализуются, если явно передать их в функцию GetFullPathName.
Вы можете передавать пути длиной более MAX_PATH символов в функцию GetFullPathName без \? . Она поддерживает пути произвольной длины, которая ограничивается лишь максимальным размером строки, поддерживаемым в Windows.
Регистр символов и файловая система Windows
Особенность файловой системы Windows заключается в том, что пользователи и разработчики, имеющие дело с другими операционными системами, могут сталкиваться с проблемами из-за того, что в именах каталогов и путях не учитывается регистр символов. Это значит, что в именах каталогов и файлов сохраняется регистр строк, используемый в момент их создания. Например, вызов метода
Directory.Create(«TeStDiReCtOrY»);
Directory.Create(«TeStDiReCtOrY»)
создает каталог с именем TeStDiReCtOrY. Если переименовать каталог или файл так, чтобы изменился регистр символов, в имени будет отражен регистр, используемый в момент переименования. Например, следующий код переименовывает файл test.txt в Test.txt:
Imports System.IO Module Example Public Sub Main() Dim fi As New FileInfo(«.test.txt») fi.MoveTo(«.Test.txt») End Sub End Module
Тем не менее при сравнении имен каталогов и файлов регистр символов не учитывается. Если выполнить поиск файла с именем «test.txt», API файловой системы .NET будут игнорировать регистр символов при сравнении. Таким образом, при поиске файла «test.txt» будут возвращены совпадения для файлов «Test.txt», «TEST.TXT», «test.TXT», а также любых других их вариантов с различным сочетанием букв в верхнем и нижнем регистре.
Источник: learn.microsoft.com
Как указать путь к файлу: основные правила
Несмотря на достаточно высокую автоматизацию всех процессов и пользовательских действий, которые предусмотрены в Windows-системах, иногда возникает необходимость ручного задания пути к какому-то объекту, хранящемуся на локальных дисках или на удаленных серверах в Интернете. Ситуаций, когда крайне необходимо вводить такие данные, может быть очень много, но обычно рядовые пользователи ограничиваются простейшими действиями при задании выполнения команд в командной строке, при быстром вызове программных модулей, при проверке расположения объектов на локальных или сетевых ресурсах и т. д. Далее попробуем определиться, как указать путь к файлу или к любому другому объекту, затронув только самые основные аспекты и действия, которые могут понадобиться в повседневной работе, не вникая в нюансы организации сложных структур веб-страниц.
Что такое путь к файлу, каталогу, диску или веб-странице?
Для начала давайте определимся с основным понятием пути файла. Что это такое? Грубо говоря, путь к любому объекту представляет собой полную или сокращенную ссылку на его физическое местоположение на жестком диске или в Интернете (но тоже на жестком диске удаленного сервера или компьютера). В некотором смысле компьютерное указание пути можно сравнить со всем привычным почтовым адресом, где вы проживаете.
Так, например, в адресе указывается страна, город, улица, дом, корпус, квартира и имя жильца. Аналогия здесь такая:
- страна – диск или удаленный сетевой ресурс;
- имя жильца или адресата – название конечного файла;
- все остальное – промежуточные подпапки.
Многие могут заметить, что в почтовом адресе указывается еще и индекс города. Его чисто условно можно соотнести, скажем, с IP-адресом страницы в Интернете или в сетевом окружении, поскольку для локальных ресурсов такие пути практически никогда не используются.
Теперь давайте посмотрим, как указать путь к файлу, исходя из такой аналогии. Для начала рассмотрим локальные ресурсы, то есть носители, подключенные непосредственно к одному компьютеру.
Типы путей
Но тут сразу стоит сделать еще одно небольшое отступление. При указании пути к любому объекту нужно учитывать, что они могут быть либо абсолютными (полными), либо относительными (сокращенными). Полные пути применяются для указания точного местоположения искомого объекта, а относительные предназначены для объектов, которые могут находиться в определенных папках, для которых указывать их расположение изначально не нужно (это чаще всего применяется в веб-программировании при создании ссылок для перехода к документу).
Как записывать путь к файлу в Windows-системах: общие правила
Но это все пока что была теория. Перейдем к практике.
Итак, абсолютный путь всегда должен начинаться с указания литеры (буквы) диска или носителя, после которой ставится двоеточие. После него вписывается обратный слэш (черта с наклоном влево), далее указываются все промежуточные каталоги (опять же через разделитель в виде слэша), а в конце вписывается имя файла с обязательным указанием его расширения.
Запись путей для веб-страниц
Теперь отдельно стоит сказать о том, как указать путь к файлу, находящемуся на удаленном сервере (в Интернете). Понятно, что в этом случае точно определить букву диска вы не сможете. Собственно, это и не нужно.
В качестве абсолютного пути указывается последовательность, в которой первым вписывается название протокола (например, http, https и т. д.). Затем ставится двоеточие, указывается двойной правый слэш. После этого через одинарный правый слэш прописываются все промежуточные страницы (ресурсы). А в конце, как и в прошлом случае, задается название файла с расширением или имя содержащего его каталога (или страницы) для просмотра всех объектов.
Как узнать, где находится файл?
Но очень часто можно встретить ситуации, когда абсолютный путь к нужному объекту вы не знаете, а его срочно нужно определить. Для этого можете воспользоваться «Проводником» и просто задать название файла в специальном поисковом поле или выполнить аналогичный поиск по расширению, вписав его после точки и заключив в звездочки.
В случае с папками в адресной строке путь можно будет скопировать, используя для этого пункт меню ПКМ «Копировать адрес как текст», а затем вставить в нужное место, дописав название файла вручную. Однако можно использовать свойства самого файла, где тоже будет указана директория, в которой он находится.
А вот в случае наличия для файла ярлыка уже в его свойствах следует обратить внимание на поле типа объекта. В котором как раз и будет указан абсолютный путь.
Методы быстрого копирования путей и открытия нужных файлов
Как указать путь к файлу, немного разобрались. Теперь кратко остановимся на некоторых методах, позволяющих ускорить открытие файлов или копирование их адресов (путей).
Например, используя копирование, описанное выше, ссылки на абсолютные пути файлов можно вставлять в командную консоль, но при этом сам путь с обеих сторон должен заключаться в кавычки. Чтобы не заниматься такими вещами, можете просто перетащить нужный объект из «Проводника» в командную строку. Если это исполняемый файл программы, она запустится немедленно. Если же это какой-то документ, он будет автоматически открыт в сопоставленном ему приложении.
Напоследок остается добавить, что очень часто может потребоваться использовать консоль «Выполнить». В качестве простейших команд в ней вводятся именно названия исполняемых компонентов, для которых путь доступа к файлу и расширение запускаемого объекта очень часто указывать не нужно. Почему? Да только потому, что меню «Выполнить» в основном предназначено для вызова исполняемых апплетов (обычно EXE-формата и некоторых других), находящихся по умолчанию либо в директории System32, либо в каталоге Windows.
Например, для запуска редактора реестра достаточно вписать только имя файла regedit, для старта стандартного «Блокнота» — notepad, для командной строки — cmd и т. д. В принципе, если выполнить некоторые нехитрые настройки, для такого типа быстрого запуска можно указать любое приложение или какой-то документ, но это уже отдельная тема для разговора.
Источник: fb.ru