Як отримати відносний шлях до файлу у Visual Studio?


83

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

/ BulutDepoProject
    / FolderIcon
        Папка.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якому випадку буде , отже ....
Джессі Чисхолм

39

Я трохи запізнився і не впевнений, чи це саме те, що ви шукаєте, але я думав, що додам його на той випадок, якщо комусь іншому буде корисно.

Припустимо, це ваша файлова структура:

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

Вам потрібно написати свій шлях щодо Main.exeфайлу. Отже, ви хочете отримати доступ Folder.ico, у своєму Main.csви можете використовувати:

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

Здавалося, це спрацювало для мене!


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.


У unix / linux '~' є синонімом "домашнього каталогу".
Nyerguds

1
@Nyerguds так. Однак коса риса неправильна, і це запитання позначено тегом «Visual Studio», який насправді не сумісний з Linux, особливо в 2012 році, коли це питання було опубліковано.
3Dзберегти

"Зазвичай можна припустити, що шляхи відносяться до папки, де знаходиться EXE" << Дуже неправда! коли ви двічі клацаєте EXE у Windows, Робочий каталог - це приватне розташування Користувача, а НЕ Виконуване місце!
Tomer W

@TomerW Є багато способів запустити виконуваний файл, крім подвійного клацання.
3Dзберегти

Правильно, проте ... додаток повинен працювати в будь-який спосіб, включаючи Dblclick, який є найбільш поширеним, я думаю.
Tomer W

17

Я також зіткнувся з тією ж проблемою, і мені вдалося її вирішити. Тож дозвольте пояснити кроки, які я застосував. Я поясню це за вашим сценарієм.

Відповідно до мого методу нам потрібно використовувати клас 'Path' та 'Assembly', щоб отримати відносний шлях.

Тож спочатку імпортуйте System.IO та System.Reflection у використанні операторів.

Потім введіть вказаний нижче рядок коду.

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

Насправді вище вказаний рядок зберігає шлях до вихідного каталогу вашого проекту (тут каталог "output" відноситься до папки Debug вашого проекту).

Тепер скопіюйте каталог FolderIcon у папку Налагодження. Потім введіть нижченаведений рядок.

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

Тепер ця змінна 'iconPath' містить весь шлях до вашого Folder.ico. Все, що вам потрібно зробити, це зберегти його у рядковій змінній. Для цього використовуйте рядок коду нижче.

string icon_path = new Uri(iconPath ).LocalPath;

Тепер ви можете використовувати цю змінну рядка icon_path як ваш відносний шлях до піктограми.

Дякую.


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" на панелі Solution Explorer. Тоді ви побачите область Властивості. Змініть поведінку "Копіювати у вихідний каталог" на "Копіювати, якщо новіша". Це змусить Visual Studio скопіювати файл у каталог вихідного коду.

Тепер, щоб отримати шлях до файлу, використовуючи відносний шлях, просто введіть:

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

Сподіваюся, що допомогло.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.