2014-01-09 2 views
1

я некоторые изображения, хранящегося в папке:Как использовать относительный путь вместо абсолютного пути

C:\MyPrograms\VisualStudio\BirdPrograms\BirdTouchScreenBasic\BirdTouchScreenBasic\pigeonImages

Я планирую использовать эту программу на другом компьютере, к которому я создаю программу ,

У меня есть массив изображений в List<Image>

Есть ли способ, чтобы загрузить изображение из относительного пути вместо абсолютного пути?

ie. вместо

Image.FromFile("C:/MyPrograms/VisualStudio/BirdPrograms/BirdTouchScreenBasic/BirdTouchScreenBasic/pigeonImages/pigeon5.png"); 

Я мог бы просто написать:

Image.FromFile("./pigeonImages/pigeon5.png"); 

Я прав в предположении, что файл Visual Basic использует для запуска программы находится в верхней папке с pigeonImages в папке одну папки вниз.

Так в командной строке я должен быть в состоянии напечатать:

C:\BirdTouchScreenBasic> cd pigeonImages

+0

Вы пробовали свое предположение? Потому что это правильно ... –

+0

«Я ошибаюсь в предположении» - да, достаточно легко проверить ... –

+0

Является ли это WPF/WinForms? –

ответ

1

Основываясь на пути вы поставляется, если текущий рабочий каталог BirdTouchScreenBasic то @".\pigeonImages\pigeon5.png" будет правильный путь. Если вы хотите, чтобы эти изображения были доступны независимо от того, где запущена программа, вы должны добавить их в свое решение и сделать так, чтобы они были скопированы в выходной каталог. Если это так, вы можете использовать относительный путь по всему вашему коду без проблем. Если вы создаете пути @".\pigeonImages\fileName.ext", но на самом деле не структурируете свой проект, чтобы папка и файлы внутри нее существовали в CWD, тогда у вас будут проблемы.

Если вы не знаете, как добавить изображения в ресурс вашего проекта C#, здесь приведены основные шаги; щелкните правой кнопкой мыши файл proj и выберите добавить новую папку, создайте папку pigeonImages. Щелкните правой кнопкой мыши папку и выберите затем новый элемент. Перейдите к файлу изображения, который вы хотите добавить, и выберите его, нажмите ok. Щелкните правой кнопкой мыши только что добавленное изображение и выберите свойства. Существует опция «Копировать в каталог вывода», которая устанавливает Копировать, если она более новая или Копировать всегда.

+0

Это то, что я искал. Я работал хорошо. У меня были изображения в папке, но я не установил свойство Copy Always. – smokeAndMirrors

1

Никогда не делайте этого, это слишком непредсказуемо, чем будет настроен ваш Environment.CurrentDirectory. Это не под вашим контролем, независимо от того, какая программа запускает вашу программу. И это происходит неправильно слишком часто.

Вместо этого вы должны создать абсолютный путь, основанный на местоположении вашего EXE. Предполагая, что вы разворачиваете файлы изображений в том же каталоге, что и EXE или в подкаталог. Используйте код, изображенный на картинке, чтобы уточнить:

using System.Reflection; 
using System.IO; 
... 
    public static Image LoadPigeon(string name) { 
     var exeDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
     var imgDir = Path.Combine(exeDir, "pigeonImages"); 
     var imgPath = Path.Combine(imgDir, name); 
     return Image.FromFile(imgPath); 
    } 
+0

AppDomain.CurrentDomain.BaseDirectory, вероятно, лучше, чем Assembly.GetEntryAssembly(). Расположение в общем случае, как описано здесь: http://stackoverflow.com/a/6041505/13087. GetEntryAssembly() может возвращать null в некоторых случаях (по общему признанию, не в приложении WinForms, что является ситуацией OP). – Joe

Смежные вопросы