Как получить относительный путь к файлу в Visual Studio?

82

Я пытаюсь получить путь к файлу изображения, который я добавил в обозреватель решений в Visual Studio, но мне не удалось получить относительный путь к этому изображению. H - файловая структура моего проекта:

/ BulutDepoProject
    / FolderIcon
        Folder.ico
        Main.cs

Я могу получить вот такое изображение:

"C:\\Users\\Tolga\\Desktop\\BulutDepo\\BulutDepoProject\\FolderIcon\\Folder.ico" 

Но я должен получить это примерно так:

"~\\FolderIcon\\Folder.ico"

Думаю, я не знаю точного синтаксиса, поэтому не могу получить изображение. :(

Толга Евсимен
источник
Вы должны проверить это => stackoverflow.com/questions/6895457/…
MarcD

Ответы:

54

Если вы хотите использовать какой-либо внешний файл, то, безусловно, есть способ поместить их в папку в вашем проекте, но не такой эффективный, как получение их из ресурсов. В обычном проекте Visual Studio у вас должен быть Resources.resxфайл в Propertiesразделе, если нет, вы можете легко добавить свой собственный Resource.resxфайл. И добавьте в него любой тип файла, вы можете найти пошаговое руководство по добавлению файлов ресурсов в свой проект здесь .

После того, как в вашем проекте есть файлы ресурсов, вызвать их очень просто:

var myIcon = Resources.MyIconFile;

Конечно, вы должны добавить такую using Propertiesинструкцию:

using <namespace>.Properties;
Толга Евсимен
источник
4
@ christo8989 OP - это файл изображения , который в readonlyлюбом случае будет , так что ....
Джесси
38

Я немного опоздал и не уверен, что это то, что вы ищете, но я подумал, что добавлю его на случай, если кто-то сочтет это полезным.

Предположим, это ваша файловая структура:

/BulutDepoProject
    /bin
        Main.exe
    /FolderIcon
        Folder.ico
        Main.cs

Вам нужно указать свой путь относительно Main.exeфайла. Итак, вы хотите получить доступ Folder.ico, в своем Main.csвы можете использовать:

String path = "..\\FolderIcon\\Folder.ico"

Похоже, это сработало для меня!

AdamInTheOculus
источник
1
В моем случае это лучшее решение, поскольку указанный файл управляется другим проектом в Решении. Разве синтаксис не поддерживает единственную точку? string path = ".\\FileName.txt"
Кристофер Дж. Грейс
1
Это ужасное решение, не используйте это ... это работает только потому, что в сценарии «Отладка» ваш текущий рабочий каталог, <Project>/Debug следовательно, работает в среде VS Debug. Но если вы выйдете из среды IDE ... или запустите EXE из другого рабочего каталога, он обязательно сломается.
Tomer W
25

Опустите "~ \":

var path = @"FolderIcon\Folder.ico";

~\ничего не значит с точки зрения файловой системы. Единственное место, которое я видел правильно, - это веб-приложение, где ASP.NET заменяет тильду абсолютным путем к корню приложения.

Обычно можно предположить, что пути указаны относительно папки, в которой находится EXE. Кроме того, убедитесь, что изображение указано как «содержимое» и «копировать, если новее» / «копировать всегда» на вкладке свойств в Visual Studio.

3Dave
источник
В unix / linux "~" является синонимом "домашнего каталога".
Nyerguds 01
1
@Nyerguds да. Однако косая черта - неправильный путь, и этот вопрос помечен как «Visual Studio», что на самом деле несовместимо с Linux, особенно в 2012 году, когда этот вопрос был опубликован.
3ave 01
«Обычно можно предположить, что пути указаны относительно папки, в которой находится EXE» << Совершенно неверно! когда вы дважды щелкаете EXE-файл в Windows, рабочий каталог является личным местоположением пользователя, а НЕ исполняемым файлом!
Tomer W
@TomerW Есть много способов запустить исполняемый файл, кроме двойного щелчка по нему.
3ave
Правильно, но ... приложение должно работать во всех отношениях, включая Dblclick, который, я думаю, является наиболее распространенным.
Tomer W
17

Я также столкнулся с той же проблемой, и я смог ее решить. Итак, позвольте мне объяснить шаги, которые я применил. Я объясню это по вашему сценарию.

Согласно моему методу, нам нужно использовать класс «Путь» и класс «Сборка», чтобы получить относительный путь.

Итак, сначала импортируйте System.IO и System.Reflection в операторы using.

Затем введите приведенную ниже строку кода.

        var outPutDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly(). CodeBase);

На самом деле в приведенной выше строке хранится путь к выходному каталогу вашего проекта (здесь выходной каталог относится к папке Debug вашего проекта).

Теперь скопируйте каталог FolderIcon в папку Debug. Затем введите приведенную ниже строку.

var iconPath = Path.Combine(outPutDirectory, "FolderIcon\\Folder.ico");

Теперь эта переменная iconPath содержит весь путь к вашему Folder.ico. Все, что вам нужно сделать, это сохранить его в строковой переменной. Используйте для этого строку кода ниже.

string icon_path = new Uri(iconPath ).LocalPath;

Теперь вы можете использовать эту строковую переменную icon_path в качестве относительного пути к значку.

Благодарю.

GeorgeT
источник
1
почему file:перед тропой
Каньон Колоб
2
@KolobCanyon Это связано с тем, что сборки .NET могут запускаться с различных URI, а не только с диска (объекты COM, RPC и т. Д.). Вы можете использовать, Assembly.GetExecutingAssembly().Locationесли уверены, что имеете дело с файлом (EXE / DLL)
Tomer W
3

Я думаю использовать это будет проще всего

new Uri("pack://application:,,/FolderIcon/" + youImageICO);

или этот код будет работать на любом компьютере, если ваша папка находится в корневом проекте, если вы хотите ее изменить ... просто измените этот раздел @ ".. \"

public static string bingPathToAppDir(string localPath)
{
    string currentDir = Environment.CurrentDirectory;
    DirectoryInfo directory = new DirectoryInfo(
        Path.GetFullPath(Path.Combine(currentDir, @"..\..\" + localPath)));
    return directory.ToString();
}
Фотонный
источник
2

В Visual Studio щелкните файл «Folder.ico» на панели «Обозреватель решений». Затем вы увидите панель «Свойства». Измените поведение «Копировать в выходной каталог» на «Копировать, если новее». Это заставит Visual Studio скопировать файл в каталог выходного лотка.

Теперь, чтобы получить путь к файлу с использованием относительного пути, просто введите:

string pathToIcoFile = AppDomain.CurrentDomain.BaseDirectory + "//FolderIcon//Folder.ico";

Надеюсь, это помогло.

Марчин
источник