Файл не найден, когда исполняемый файл запущен из другого приложения - PullRequest
2 голосов
/ 15 июля 2011

В моем приложении после входа в систему я устанавливаю несколько изображений picturebox / button / etc и делаю их масштабирование и еще много чего.Я использую относительные пути, например:

@".\Images\SomeImage.png"

Работает нормально, когда приложение запускается напрямую, но если вы пытаетесь запустить его через другое приложение:

Process process = new Process();
process.StartInfo.FileName = networkPath;
process.Start();

Умирает и приходитс файлом не найдена ошибка, потому что он не может найти изображения.Это также происходит, если я пытаюсь запустить его через командную строку.Исполняемый файл хранится на сетевом диске.Почему относительный путь не работает в этой ситуации?Я могу просто пойти дальше и жестко запрограммировать полный путь, но это заставляет меня чувствовать себя грязным ... Есть мысли?

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

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

Обычно ваше приложение будет запускаться с рабочим каталогом в качестве каталога, в котором содержится исполняемый файл - это значение по умолчанию, например, при создании нового ярлыка (вы можете увидеть это в свойствах ярлыка в поле «Начать с»). .

Когда ваше приложение запускается из командной строки или из другого приложения, однако рабочий каталог изменяется, а относительные пути преобразуются в совершенно другой каталог.

Вы можете либо изменить вызывающее приложение, чтобы задать для свойства WorkingDirectory нового процесса значение, которое он ожидает, однако это правильный способ исправить это, чтобы модифицировать ваше приложение так, чтобы оно использовало абсолютное значение. пути, основанные на пути к исполняемому файлу. Assembly.GetExecutingAssembly().Location можно использовать для получения пути к исполняемому файлу, поэтому следующий код должен помочь:

static string GetAbsolutePathFromRelative(string RelativePath)
{
    string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    string absolutePath = Path.Combine(directory, RelativePath);
    // This final call is to stop paths like "C:\Dir\..\OtherDir\file.txt" being returned
    return Path.GetFullPath(absolutePath);
}   
3 голосов
/ 15 июля 2011

Необходимо установить для свойства Process.WorkingDirectory правильный путь.

Путь, который вы отправили:

@".\Images\SomeImage.png"

Это не сетевой путь (это не UNC или не подключенный диск).

...