Путь к исполняемому файлу оболочки dotnet не является файлом или символической ссылкой
Я создаю сценарий оболочки, который берет имя файла / путь к файлу и определяет, является ли файл символической ссылкой или жесткой ссылкой.
Единственное, я не знаю, как узнать, являются ли они жесткой связью. Я создал 2 файла, один из которых является жесткой ссылкой, а другой - символической ссылкой для использования в качестве тестового файла. Но как мне определить, является ли файл жесткой ссылкой или символическим в сценарии оболочки?
Кроме того, как я могу найти целевой раздел символической ссылки? Допустим, у меня есть файл, который ссылается на другой раздел, как мне найти путь к этому исходному файлу?
@terdon ln /foo/bar/ /foo/bar2 делает жесткую ссылку, в то время как ln -s /foo/bar /foo/bar2 делает символическую ссылку, вот что он имеет в виду?
@DisplayName да, но все файлы являются жесткими ссылками на их индекс. Вот как работают файловые системы Linux. В вашем примере bar2 и bar обе жесткие ссылки, просто указывающие на один и тот же индекс.
@DisplayName да, это жесткие ссылки на другие иноды . Здесь нет противоречия. Файл - это ссылка на индекс. Это определение файла. В вашем случае у вас есть эти ссылки в разных местах, но это не меняет основную структуру данных. Моя точка зрения заключается в том, что оба bar и bar2 одинаково важны. Одна не является ссылкой на другую, они обе являются ссылками, но указывают на один и тот же индекс.
@ Скотт нет, я говорю, что обычные файлы - это жесткие ссылки, и созданные жесткие ссылки ln ничем не отличаются от обычных файлов.
Ответ Джим объясняет , как проверить на линке: с помощью test «s -L тест.
Но тестирование на «жесткую ссылку», строго говоря, не то, что вы хотите. Жесткие ссылки работают из-за того, как Unix обрабатывает файлы: каждый файл представлен одним индексом. Тогда один инод имеет ноль или более имен или записей каталога или, технически, жестких ссылок (то, что вы называете «файлом»).
К счастью, stat команда, где она доступна, может сказать вам, сколько имен у inode.
Итак, вы ищете что-то вроде этого (здесь предполагается реализация GNU или busybox stat ):
Этот -c '%h' бит говорит stat просто выводить количество жестких ссылок на индекс, т. Е. Количество имен в файле. -gt 1 затем проверяет, больше ли это 1.
Обратите внимание, что символические ссылки, как и любые другие файлы, также могут быть связаны с несколькими каталогами, поэтому вы можете иметь несколько жестких ссылок на одну символическую ссылку.
Хорошо, просто для ясности, я могу вывести количество жестких ссылок, которые имеет файл, используя команду stat, и если его значение больше 1, то у него есть другой файл, связанный где-то в разделе.
На OS X или * BSD это так stat -f %l /path/to/file . Вы также можете использовать, gstat -c %h /path/to/file если у вас установлены GNU coreutils без имен по умолчанию (с Homebrew на OS X).
В f1 , f2 и f3 запись каталога и тот же файл (тот же индексный дескриптор: 10802124, вы заметите , количество ссылок является 3). Это жесткие ссылки на один и тот же обычный файл.
s4 а s5 также тот же файл (10802384). Они имеют тип symlink , а не обычные . Они указывают на путь, здесь s3 . Поскольку s4 и s5 являются записями одного и того же каталога, этот относительный путь s3 указывает на один и тот же файл (файл с inod 10802347) для обоих.
Если вы делаете ls -Ll , то запрашиваете информацию о файле после разрешения символических ссылок:
Вы найдете, что они все разрешают к тому же файлу (10802124).
Вы можете проверить, является ли файл символической ссылкой [ -L file ] . Точно так же вы можете проверить, является ли файл обычным файлом [ -f file ] , но в этом случае проверка выполняется после разрешения символических ссылок.
Жесткие ссылки - это не тип файла, это просто разные имена для файла (любого типа).
Использование -h и -L операторы test команды:
Согласно этому потоку SO , они ведут себя одинаково, но -L предпочтительнее.
хорошо, круто, а как насчет жестких ссылок? Я проверил шаг, но ничего о жестких ссылках. Если -L возвращает false, означает ли это жесткую ссылку? или просто обычный файл?
Жесткие ссылки делят то же самое inode . Кроме того, программные ссылки показывают l в начале ls -l вывода . Я думаю, что вы можете объединить эти правила в сценарии, а также [[ -L file ]] проверить, является ли данный файл мягким или жестким .
Если ты читаешь все это и понимаешь, что происходит, тогда ты в порядке; Вам не нужно читать мою маленькую часть. Если вы все еще в замешательстве, то продолжайте.
Действительно очень короткий ответ заключается в том, что жесткая ссылка на самом деле вовсе не ссылка, а не символическая ссылка. Это новая запись в структуре каталогов, которая указывает на тот же набор байтов, что и оригинальная запись каталога, и после того, как вы ее создали, она так же «реальна» и легитимна, как и первая. Каждый «нормальный» файл на вашем диске имеет хотя бы одну жесткую ссылку; без этого вы бы не увидели ни в одномкаталог, и не сможет ссылаться на него или использовать его. Поэтому, если у вас есть файл Fred.txt и вы жестко связываете с ним Wilma.txt и Barney.txt, все три имени (и записи каталога) ссылаются на один и тот же файл, и все они одинаково действительны. Для ОС нет никакого способа сказать, что одна из записей была создана, когда вы нажали «сохранить» в текстовом редакторе, а другие были сделаны с помощью команды «ln».
ОС действительно должны отслеживать , сколько различных записей , указывающих на тот же файл, хотя. Если вы удалите Wilma.txt, не удивительно, что вы не освободите место на диске. Но если вы удалите Fred.txt («оригинальный» файл), вы все равно не освободите место на диске, потому что данные на диске, который был известен как Fred.txt, по-прежнему также Barney.txt. Только когда вы удалите все записи каталога, ОС освободит место, которое занимали сами данные.
Поскольку ОС должна отслеживать, сколько разных записей каталога указывают на один и тот же кусок данных, вы можете определить, была ли жесткая ссылка на конкретный файл, даже если вы не можете точно сказать, является ли эта запись каталога Вы смотрите на «оригинал» или нет. Одним из способов является команда «ls», а именно «ls -l» (это строчная буква L после тире)
Заимствовать более ранний пример .
Первая буква - тире, так что это не каталог или что-то еще экзотическое, это обычный файл. Но если бы оно было действительно обычным, это число после части rwx-ish было бы «1», как, например, «есть одна запись каталога, указывающая на этот блок данных». Но это часть демонстрации жестких ссылок, поэтому вместо этого написано «3».
Обратите внимание, что это может привести к странному и таинственному поведению (то есть, если вы не обернулись вокруг жестких ссылок). Если вы откроете Fred.txt в текстовом редакторе и внесете некоторые изменения, увидите ли вы те же изменения в Wilma.txt и Barney.txt? Может быть. Вероятно. Если ваш текстовый редактор сохраняет изменения, открыв исходный файл и записав в него изменения, то да, все три имени будут по-прежнему указывать на один и тот же (недавно измененный) текст. Но если ваш текстовый редактор создает новый файл (Fred-new-temp.txt), записывает в него измененную версию, затем удаляет Fred.txt, а затем переименовывает Fred-new-temp.txt в Fred.txt, Вильма и Барни по-прежнему указывать на оригинальную версию, а не на новую измененную версию. Если вы не понимаете жестких ссылок, это может привести вас в бешенство. :) [Ладно, я лично не знаю ни одноготекстовые редакторы, которые будут выполнять функцию new-file / rename, но я знаю много других программ, которые делают именно это, так что будьте начеку.]
И последнее замечание: одна из вещей, которую проверяет fsck (проверка файловой системы), состоит в том, есть ли на вашем диске блоки данных, на которые почему-то больше не ссылаются какие-либо записи каталога. Иногда что-то идет не так, и единственная запись в каталоге, которая указывает на индекс, удаляется, но само пространство диска не помечается как «доступное». Таким образом, одна из задач fsck - сопоставить все выделенное пространство со всеми записями каталога, чтобы убедиться, что нет никаких файлов, на которые нет ссылок. Если он находит некоторые, он создает новые записи каталога и помещает их в «lost + found».
Члены большинства типов в пространстве имен System.IO имеют параметр path , который позволяет указать абсолютный или относительный путь к ресурсу в файловой системе. Этот путь передается в API файловой системы Windows. В этом разделе рассматриваются форматы путей к файлам, которые можно использовать в операционных системах Windows.
Решение
Тем, что класс Application находится в сборке System.Windows.Forms, а путь запуска может затребовать консольное приложение, WPF, библиотека классов и т.д.
Тем, что класс Application находится в сборке System.Windows.Forms, а путь запуска может затребовать консольное приложение, WPF, библиотека классов и т.д.
Это корневая директория, с которой резолвер начинает искать подключаемые сборки.
Она может не совпадать с директорией, в которой лежит исполняемый файл.
Это корневая директория, с которой резолвер начинает искать подключаемые сборки.
Она может не совпадать с директорией, в которой лежит исполняемый файл.
В каком случае они не совпадают, кроме ситуации, когда домен создаётся искусственно?
А вообще, тут только Application.StartupPath гарантирует именно путь к exe'шнику, т. к. он вызывает GetModuleFileName с нулевым хендлом.
Вариант с GetExecutingAssembly, если окажется в dll, вернёт путь к ней, а он не обязательно совпадёт с путём к exe.
CurrentDirectory тут вообще не в тему.
Я скачал игру (Shank), но файл bin не запускается. Ошибка, которая отображается при попытке запустить исполняемый файл:
Спасибо за ваш ответ. Я выполнил команду, которую вы сказали Agent86, но у меня тот же результат. Я также скачал файл .deb, но есть проблема. Я не знаю, в чем проблема этой игры.
Пожалуйста, подтвердите, используете ли вы 64-битную установку (это наиболее распространенный случай для этой проблемы).
Вероятно, вы пытаетесь запустить 32-разрядный двоичный файл в 64-разрядной системе, в которой не установлена 32-разрядная поддержка.
- Файл не существует. Я предполагаю, что вы проверили, что файл существует (возможно, потому что оболочка завершает его).
- Файл с таким именем существует, но это свисающая символическая ссылка.
- Файл существует, и вы даже можете прочитать его (например, команда file shank-linux-120720110-1-bin отображает что-то вроде «ELF 32-битный исполняемый файл LSB…»), и все же, когда вы пытаетесь выполнить его, вам говорят, что файл не существует.
Команда file скажет вам, что это за двоичный файл. За некоторыми исключениями, вы можете запустить только двоичный файл для архитектуры процессора, для которой предназначен ваш выпуск Ubuntu. Основным исключением является то, что вы можете запускать 32-битные (x86, aka IA32) двоичные файлы в 64-битных (amd64, aka x86_64) системах.
Поскольку в 11.10 (oneiric) появилась поддержка multiarch , вы все равно можете установить ia32-libs , но вы можете выбрать более детальный подход, которого достаточно получить (плюс любую другую необходимую библиотеку). libc6-i386
Спасибо за отличный ответ, Жиль. Хотя я еще не сталкивался с этой проблемой (пока!), Я оставил ваш ответ для дальнейшего использования.
Спасибо за исчерпывающий ответ! Файл bin, который я скачал, был единственным, доступным в этом формате (bin). Так что я думаю, что это хорошо для всех архитектур. Я также скачал файл .deb для моей архитектуры (64 бита), но с другой ошибкой. На данный момент я думаю, что на игру влияют некоторые ошибки, или я не могу установить эту игру. Сейчас я пытаюсь загрузить libc6-i386 и все еще пытаюсь установить его. Я напишу снова, если будут значительные изменения. Спасибо за ваше время.
@Francesco Пожалуйста, опубликуйте решение! Это может помочь другим людям, пытающимся запустить Shank на Ubuntu. Это нормально, чтобы ответить на свой вопрос .
Вы можете использовать, ldd чтобы проверить, если вы пропустили библиотеку. ldd kgio_ext.so может сказать что-то подобное libruby.so.2.3 => not found среди других
Идентификация пути
На первом шаге процесса нормализации осуществляется идентификация типа пути. Пути могут относиться к одной из нескольких категорий:
- Пути к устройствам: начинаются с двух разделителей и знака вопроса или точки ( \\? или \\. ).
- UNC-пути: начинаются с двух разделителей без знака вопроса или точки.
- Полные пути DOS: начинаются с буквы диска, разделителя томов и компонентов ( C:\ ).
- Пути к устаревшим устройствам ( CON , LPT1 ).
- Пути относительно корня текущего диска: начинаются с одного разделителя компонентов ( \ ).
- Пути относительно текущего каталога указанного диска: начинаются с буквы диска и разделителя томов, но не содержат разделителя компонентов ( C: ).
- Пути относительно текущего каталога: начинаются с любых других символов ( temp\testfile.txt ).
Тип пути определяет, будет ли каким-либо образом применяться текущий каталог. Кроме того, от типа пути зависит применяемый корень.
Традиционные пути DOS
Стандартный путь DOS может состоять из трех компонентов:
- Буква тома или диска, после которой следует разделитель томов ( : ).
- Имя каталога. Символ разделителя каталогов служит для разделения подкаталогов во внутренней иерархии каталога.
- Необязательное имя файла. Символ разделителя каталогов служит для разделения пути к файлу и его имени.
Если присутствуют все три компонента, путь является абсолютным. Если буква тома или диска не указана и имя каталога начинается с символа разделителя каталогов, такой путь задан относительно корня текущего диска. В противном случае путь задан относительно текущего каталога. В следующей таблице показаны некоторые возможные пути к каталогам и файлам.
Путь | Описание: |
---|---|
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.
Применение текущего каталога
Если путь не является полным, система Windows применяет к нему текущий каталог. К UNC-путям и путям к устройствам текущий каталог не применяется. Также текущий каталог не применяется к полным путям к диску с разделителем C:\ .
Если путь начинается с одного разделителя компонентов, применяется диск текущего каталога. Например, для пути к файлу \utilities и текущего каталога C:\temp\ в результате нормализации будет получен путь C:\utilities .
Если путь начинается с буквы диска, разделителя томов и не содержит разделителя компонентов, применяется последний текущий каталог, установленный из командной оболочки. Если последний текущий каталог не был установлен, применяется диск сам по себе. Например, для пути D:sources , текущего каталога C:\Documents\ и последнего текущего каталога D:\sources\ на диске D: в результате будет получен путь D:\sources\sources . Пути, задаваемые относительно диска, являются распространенными источниками ошибок программ и логики скрипта. Предположение, что путь, начинающийся с буквы и двоеточия, не является относительным, очевидно неверно.
Если путь не начинается с разделителя, применяются текущий диск и текущий каталог. Например, для пути к файлу filecompare и текущего каталога C:\utilities\ в результате будет получен путь C:\utilities\filecompare\ .
Среда выполнения не найдена
Накат не выполняется по умолчанию в двух распространенных сценариях:
- доступны только более ранние версии среды выполнения; при накате выбираются только более поздние версии среды выполнения;
- доступны только более поздние основные версии среды выполнения. При накате границы основной версии не пересекаются.
Если приложению не удается найти подходящую среду выполнения, оно не запускается и сообщает об ошибке.
Изменение имен пакетов
Корпорация Майкрософт изменила правила в отношении идентификаторов пакетов для средств, из-за чего некоторые средства теперь невозможно найти по прежним именам. Новое руководство заключается в том, что все средства корпорации Майкрософт имеют префикс Microsoft. Этот префикс зарезервирован и может использоваться только для пакетов, подписанных с помощью полномочного сертификата Майкрософт.
Во время перехода некоторые средства Майкрософт будут иметь старую форму идентификатора пакета, а другие — новую форму:
По мере обновления идентификаторов пакетов необходимо будет перейти на новый идентификатор, чтобы получить последние обновления. Пакеты с упрощенными именами средств станут нерекомендуемыми.
Канонизация разделителей
Все символы косой черты ( / ) преобразуются в стандартные разделители Windows, то есть символы обратной косой черты ( \ ). Если они присутствуют, последовательность символов косой черты после первых двух таких символов свертывается в один символ косой черты.
Работа с устаревшими устройствами
Если путь указывает на устаревшее устройство DOS, например CON , COM1 или LPT1 , он преобразуется в путь к устройству путем добавления перед ним последовательности \\.\ и возвращается в таком виде.
Путь, который начинается с имени устаревшего устройства, всегда интерпретируется как путь к устаревшему устройству с помощью метода Path.GetFullPath(String). Например, путь к устройству DOS CON.TXT будет выглядеть как \\.\CON , а путь к устройству DOS COM1.TXT\file1.txt будет выглядеть как \\.\COM1 .
64-битные системы Ubuntu Multiarch
Следуйте этому ответу, только если вывод file file-name показывает,
Для того, чтобы запустить 32 - битный исполняемый файл в 64 битном мульти-арочной системы Ubuntu, вы должны добавить i386 архитектуру , а также вы должны установить libc6:i386 , libncurses5:i386 , libstdc++6:i386 эти три библиотеки пакетов.
Я бы использовал sudo для последней команды: запуск 32-битного двоичного файла (так что очевидно, что он не скомпилирован вами или Ubuntu), поскольку sudo может быть рискованным. (ну, даже не как root, восхищенно)
Следует отметить, что если вы используете CentOS или RedHat, этот ответ не применяется. Был скинут на несколько часов из-за этого.
Установив deb для 32-битной системы, я понял, что мне не хватает некоторых библиотек (в дополнение к ia32-libs и libc6). Сначала я решил эту проблему, дав следующую команду:
Тогда я получил еще одну ошибку:
Очевидно, что эти библиотеки были правильно установлены. Не вдаваясь в детали, мне пришлось связывать библиотеки вручную. Тогда я понял, что через Synaptic можно было бы также проще установить следующие пакеты:
Надеюсь это кому-нибудь пригодится. Если вам нужна дополнительная помощь или более подробная информация, пожалуйста, не стесняйтесь связаться со мной.
После установки libc6: i386 все начинает улучшаться .
Чтобы завершить работу, вам может понадобиться определить и установить дополнительные библиотеки по одной за раз .
Чтобы расширить ответ @Gilles, есть как минимум три сценария, приводящие к этой ошибке:
Категории проблем с загрузчиком:
Загрузчик исполняемого файла не существует. Вы можете проверить это с помощью команды file и посмотреть, существует ли загрузчик. Например
Обратите внимание interpreter /lib64/ld-lsb-x86-64.so.3 ; если этот файл не существует, вам необходимо установить его. Для данного конкретного загрузчика 16.04 ответ оказался sudo apt-get install lsb .
Проблемы с загрузчиком скрипта (см. Этот ответ ).
Загрузчик не существует может быть из-за несоответствия 32/64 бит или по другой причине. Могут быть и другие ошибки загрузчика, о которых я не знаю.
UNC-пути
UNC-пути (универсальное соглашение об именовании) используются для доступа к сетевым ресурсам и имеют следующий формат:
- Имя сервера или узла, которому предшествуют символы \\ . В качестве имени сервера может выступать имя компьютера NetBIOS, а также IP-адрес или полное доменное имя (поддерживаются адреса IPv4 и IPv6).
- Имя общего ресурса, которое отделяется от имени узла символами \ . Имя сервера и имя общего ресурса в совокупности образуют том.
- Имя каталога. Символ разделителя каталогов служит для разделения подкаталогов во внутренней иерархии каталога.
- Необязательное имя файла. Символ разделителя каталогов служит для разделения пути к файлу и его имени.
Ниже приводятся некоторые примеры UNC-путей:
Path | Описание |
---|---|
\\system07\C$\ | Корневой каталог диска 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\ часть server1\utilities представляет сервер или общий сетевой ресурс. Это важно при вызове такого метода, как Path.GetFullPath(String, String) с сегментами с относительным путем к каталогу, поскольку переход дальше тома невозможен.
Пути к устройствам DOS являются полными по определению и не могут начинаться с относительным сегментом каталога ( . или .. ). Они никогда не задаются относительно текущего каталога.
Исполняемый файл не найден
Имя исполняемого файла определяет то, как вызывается средство. Формат описывается в приведенной ниже таблице.
Формат имени исполняемого файла | Формат вызова |
---|---|
dotnet-.exe | dotnet |
.exe |
Глобальные средства
Глобальные средства можно установить в каталоге по умолчанию или в выбранном вами расположении. Каталоги по умолчанию:
Операционная система | Path |
---|---|
Linux/macOS | $HOME/.dotnet/tools |
Windows | %USERPROFILE%\.dotnet\tools |
Если вы пытаетесь запустить глобальное средство, убедитесь в том, что переменная среды PATH на компьютере содержит путь, по которому установлено глобальное средство, и что исполняемый файл находится по этому пути.
Локальные средства
Если вы пытаетесь запустить локальное средство, убедитесь в наличии файла манифеста с именем dotnet-tools.json в текущем каталоге или в любом из его родительских каталогов. Этот файл также может находиться в папке .config где угодно в иерархии папок проекта, а не в корневой папке. Если файл dotnet-tools.json существует, откройте его и проверьте наличие средства, которое вы пытаетесь запустить. Если в файле нет записи для "isRoot": true , также проверьте наличие дополнительных файлов манифестов средств выше в иерархии файлов.
Удаление знаков
Помимо удаленных ранее разделителей и относительных сегментов во время нормализации также удаляются некоторые дополнительные знаки:
Если сегмент заканчивается одной точкой, эта точка удаляется. (Сегмент одной или двойной точки нормализован на предыдущем шаге. Сегмент из трех или более периодов не нормализован и действительно является допустимым именем файла или каталога.)
Если путь не заканчивается разделителем, удаляются все конечные точки и пробелы (U+0020). Если последний сегмент содержит только одну или две точки, к нему применяется приведенное выше правило для относительных компонентов.
Это правило устанавливает, что вы можете создать имя каталога с конечным пробелом, добавив разделитель после пробела.
Создавать имена каталогов или файлов с конечным пробелом нельзя. Наличие конечных пробелов может затруднить или исключить возможность доступа к каталогу. В связи с этим при попытке обработать каталоги или файлы, имена которых содержат конечные пробелы, происходит сбой приложения.
Нормализация путей
Практически все передаваемые в API Windows пути нормализуются. При нормализации в Windows выполняются следующие действия:
- Идентифицируется путь.
- Текущий каталог применяется к неполным (относительным) путям.
- Выполняется канонизация разделителей каталогов.
- Вычисляются относительные компоненты каталога ( . для текущего и .. для родительского каталога).
- Удаляются некоторые символы.
Нормализация происходит неявно, но ее можно выполнить явным образом, вызвав Path.GetFullPath метод, который создает оболочку для вызова функции жетфуллпаснаме (). Также можно вызвать функцию GetFullPathName() Windows напрямую с помощью P/Invoke.
Вычисление относительных компонентов
При обработке пути выполняется вычисление любых его компонентов или сегментов, которые состоят из одной или двух точек ( . или .. ):
Если обнаруживается одна точка, текущий сегмент удаляется, поскольку он ссылается на текущий каталог.
Если обнаруживаются две точки, удаляются текущий и родительский сегмент, поскольку в этом случае задается ссылка на родительский каталог.
Родительские каталоги удаляются только в том случае, если они не находятся после корня пути. Корень пути зависит от его типа. Это будет диск ( C:\ ) для путей DOS, сервер или общий сетевой ресурс для UNC-путей ( \\Server\Share ) и префикс пути к устройству для путей к устройствам ( \\?\ или \\.\ ).
401 (не санкционировано)
Скорее всего, вы указали альтернативный канал NuGet, и этот канал требует проверки подлинности. Вот несколько разных способов решить проблему:
Добавьте параметр --ignore-failed-sources , чтобы обойти ошибку из закрытого канала и использовать общедоступный канал Майкрософт.
Если вы устанавливаете средство из канала Microsoft NuGet, пользовательский канал возвращает эту ошибку, прежде чем канал Microsoft NuGet вернет результат. Ошибка завершает запрос, отменяя любые другие ожидающие запросы канала, который может быть каналом Microsoft NuGet. Добавление параметра --ignore-failed-sources приводит к тому, что команда обрабатывает эту ошибку как предупреждение и позволяет другим каналам обработать запрос.
Принудительно используйте канал Microsoft NuGet с параметром --add-source .
Возможно, в глобальном или локальном файле конфигурации NuGet отсутствует общедоступный канал Microsoft NuGet. Используйте сочетание параметров --add-source и --ignore-failed-sources , чтобы избежать ошибочного канала и использовать общедоступный веб-канал Майкрософт.
Используйте настраиваемую конфигурацию NuGet, параметр --configfile .
создайте локальный файл nuget.config , используя только общедоступный веб-канал NuGet майкрософт, и сослаться на него с помощью параметра:
Пример файла конфигурации:
Добавьте необходимые учетные данные в файл конфигурации.
Если пакет точно существует в настроенном веб-канале, укажите учетные данные для входа в файле конфигурации NuGet. Дополнительные сведения об учетных данных в файле конфигурации NuGet см. в разделе packageSourceCredentials в справочнике по nuget.config.
Как узнать где находиться файл запуска моего проекта просто потом хочу привентитить относительна к нему другие файлы.
Как узнать путь к исполняемому файлу?
запускаю прогу test.exe как в ней самой определить где она находится(путь) всякие.
Путь к исполняемому файлу
Хочу написать программу из двух частей. Вторую часть программы запускает первая, а вторая должна.
Получить путь к исполняемому файлу службы
Доброго времени суток. мне нужно получить информацию о службах Windows. Путь, отобр имя, имя.
Узнать путь к текстовому файлу
У меня такой вопрос. Создал текстовый файл на рабочем столе. Как в программе вывести путь к этому.
вернёт путь к папке откуда запускается exe.
А вообще, если тебе надо именно в папке с exe хранить что-то, то необязательно таким образом указывать путь. Достаточно имя файла указывать и всё.
Пример. Способы задать ссылку на один и тот же файл
В следующем примере демонстрируются некоторые способы задать ссылку на файл с использованием API в пространстве имен System.IO. В этом примере создается экземпляр объекта FileInfo и используются его свойства Name и Length, чтобы отобразить имя и длину файла.
Предварительные выпуски
- Вы пытаетесь установить предварительный выпуск и не использовали параметр --version для указания версии.
NU1212: недопустимое сочетание проекта и пакета для . Стиль проекта DotnetToolReference допускает только ссылки типа DotnetTool.
Решение
Не запутывайте, пожалуйста, людей.
CurrentDirectory возвращает путь к рабочей папке.
Веб-канал NuGet недоступен
- Не удается получить доступ к требуемому веб-каналу NuGet, возможно, из-за проблемы с подключением к Интернету.
Для установки средства требуется доступ к веб-каналу NuGet, содержащему пакет средства. Установка завершается сбоем, если этот веб-канал недоступен. Вы можете изменить веб-каналы с помощью nuget.config , запросить определенный файл nuget.config или указать дополнительные веб-каналы с помощью параметра --add-source . По умолчанию NuGet выдает ошибку для каждого веб-канала, к которому не удается подключиться. Флаг --ignore-failed-sources позволяет пропускать недоступные источники.
Регистр символов и файловая система Windows
Особенность файловой системы Windows заключается в том, что пользователи и разработчики, имеющие дело с другими операционными системами, могут сталкиваться с проблемами из-за того, что в именах каталогов и путях не учитывается регистр символов. Это значит, что в именах каталогов и файлов сохраняется регистр строк, используемый в момент их создания. Например, вызов метода
создает каталог с именем TeStDiReCtOrY. Если переименовать каталог или файл так, чтобы изменился регистр символов, в имени будет отражен регистр, используемый в момент переименования. Например, следующий код переименовывает файл test.txt в Test.txt:
Тем не менее при сравнении имен каталогов и файлов регистр символов не учитывается. Если выполнить поиск файла с именем "test.txt", API файловой системы .NET будут игнорировать регистр символов при сравнении. Таким образом, при поиске файла "test.txt" будут возвращены совпадения для файлов "Test.txt", "TEST.TXT", "test.TXT", а также любых других их вариантов с различным сочетанием букв в верхнем и нижнем регистре.
Пропуск нормализации
Как правило, любой путь, передаваемый в API Windows передается в функцию GetFullPathName и нормализуется. Существует одно важное исключение: путь к устройству, который начинается со знака вопроса, а не с точки. Если путь не начинается с последовательности \\?\ (обратите внимание на использование канонической формы с обратной косой чертой), он нормализуется.
Зачем нужно пропускать нормализацию? Существует три основных причины:
Получение путей, которые в обычных обстоятельствах недоступны, но являются допустимыми. Например, невозможно каким-либо иным способом получить доступ к файлу или каталогу с именем hidden. .
Повышение производительности за счет пропуска нормализации в тех случаях, когда нормализация уже выполнена.
Пропуск нормализации и проверки максимальной длины пути является единственным отличием между двумя видами синтаксиса путей к устройствам. В остальных аспектах они идентичны. Пропуск нормализации следует использовать с осторожностью, поскольку в этом случае легко получить пути, при работе с которыми в обычных приложениях будут возникать трудности.
Пути, начинающиеся с последовательности \\?\ , по-прежнему нормализуются, если явно передать их в функцию GetFullPathName.
Вы можете передавать пути длиной более MAX_PATH символов в функцию GetFullPathName без \\?\ . Она поддерживает пути произвольной длины, которая ограничивается лишь максимальным размером строки, поддерживаемым в Windows.
Читайте также: