Как указать путь к программе

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

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

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

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

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

Как узнать путь к файлу

Обратите внимание на различия между двумя последними путями. В обоих случаях задается необязательный описатель тома ( 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-путей:

Path Описание
\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 и нормализуется. Существует одно важное исключение: путь к устройству, который начинается со знака вопроса, а не с точки. Если путь не начинается с последовательности \? (обратите внимание на использование канонической формы с обратной косой чертой), он нормализуется.

Зачем нужно пропускать нормализацию? Существует три основных причины:

  1. Получение путей, которые в обычных обстоятельствах недоступны, но являются допустимыми. Например, невозможно каким-либо иным способом получить доступ к файлу или каталогу с именем hidden. .
  2. Повышение производительности за счет пропуска нормализации в тех случаях, когда нормализация уже выполнена.
  3. Только на платформе .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

Как указать путь к файлу, который находится рядом с файлом .exe [дубликат]

Отслеживать

proritsatel

задан 6 дек 2019 в 7:26

proritsatel proritsatel

79 6 6 бронзовых знаков

Указать не абсолютный, а относительный путь.

6 дек 2019 в 7:29

6 дек 2019 в 7:55

Directory.GetCurrentDirectory() — возвращает текущую рабочую директорию

6 дек 2019 в 7:56

Ну а по поводу комментариев выше (относительный путь и текущая раб. директория) — это как по мне неверное решения, ибо если запустить например .exe файл через консоль, просто прописав путь до exe/моя программа.exe , то рабочей директорией будет либо C:Windows , либо директория пользователя. Будет ли там файл нужный вам? Я не думаю. Также рабочий каталог меняется и при помощи простого ярлыка. Все конечно зависит от того, что в итоге вы хотите, но мой вам совет — используйте пункт 4 из помеченного мной как дубликат вопроса.

6 дек 2019 в 9:01

Если вы не зададите рабочий каталог, где находится ваш файл, то нет, работать не будет. Попробуйте просто откройте консоль и напишите [путь до программы]/ChromaWrite.exe и посмотрите на результат) Что бы этого избежать, надо писать cd [путь до программы] и только потом писать ChromaWrite.exe и вот cd вам задаст нужный каталог. Ну или попробуйте через ярлык заменить это значение на любое другое и все, ваше приложение нерабочее. В общем, мое дело предупредить, а уже вам решать, устранять этот недочет или «и так сойдет».

Источник: ru.stackoverflow.com

Как указать путь к программе

Абсолютные и относительные ссылки. Как указать путь к файлу правильно Абсолютные ссылки всегда начинаются с имени протокола. Например http:// и содержат имя файла.

Относительные — ведут отсчет от корня сайта или текущего документа.

При обращении к каталогу без явного указания названия файла (то, что пишется в конце, после /fail.html) обычно открывается индексный файл — index.html. Это стоит помнить, чтобы всегда вы могли защитить свой сайт от мошенников. Об этом я рассказываю в настройках WP.

Абсолютные ссылки обычно применяются для указания документа на другом сетевом ресурсе, впрочем, допустимо делать абсолютные ссылки и внутри текущего сайта. Однако подобное практикуется нечасто, поскольку такие ссылки достаточно длинные и громоздкие. Поэтому внутри сайта преимущественно используются относительные ссылки.
Если вы забыли как правильно написать ссылку в коде , то следует вернуться к этому посту.
Рассмотрим создание относительных ссылок более подробно.

Вариант 1 Фалы располагаются в одной папке?

Здесь все просто. Нужно сделать ссылку из исходного на ссылаемый. То есть вот так:

Здесь путь такой

Здесь нужно выйти — ../ из одной и второй ../ папки и там уже найти файл

Как видите, ничего трудного нет в этом, если знать, как правильно обозначить путь к файлу.

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

Зато на компьютере вообще все проще простого.

Сейчас я вам расскажу пару фишек о том, как легко и точно прописать путь к файлу.

  1. Выбираете нужный вам файл
  2. Зажмите кнопку Shift и щелкаете правой кнопкой мыши.
  3. В открывшемся меню выбираете копировать путь к файлу.
  4. Вставляете сразу после = без кавычек. Они подставятся автоматически.

Если вы пользуетесь командной строкой на компьютере. Лично у меня она даже закреплена в панели задач. То..

  1. Открываете командную строку
  2. Просто перетаскиваете туда нужный файл
  3. Получаете точный путь к вашему файлу. Копируйте и наслаждайтесь!

На этом все на сегодня. Хочется добавить. что при создании папок и файлов не стоит пользоваться кириллицей и тем более пробелом, или разными регистрами символов.
Пробуйте, экспериментируйте и делитесь своими «фишками» и «кейсами».

Хотите освоить самые современные методы написания React приложений? Надоели простые проекты? Нужны курсы, книги, руководства, индивидуальные занятия по React и не только? Хотите стать разработчиком полного цикла, освоить стек MERN, или вы только начинаете свой путь в программировании, и не знаете с чего начать, то пишите через форму связи, подписывайтесь на мой канал в Телеге, вступайте в группу на Facebook.

Источник: abcinblog.blogspot.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru