Как работает разрешение по умолчанию / относительный путь в .NET? - PullRequest
7 голосов
/ 05 ноября 2008

Итак ... Раньше я думал, что когда вы обращаетесь к файлу, но указали имя без пути (в моем случае CAISLog.csv), .NET ожидает, что файл будет находиться на том же пути, что и запущенный .exe ,

Это работает, когда я прохожу решение (C # .NET2. * VS2K5), но когда я запускаю приложение в обычном режиме (запускается монитором Websphere MQ Trigger и работает в фоновом режиме в качестве сетевой службы) вместо обращаясь к файлу по пути, где находится .exe, он ищется в C: \ WINDOWS \ system32. Если это имеет значение .exe родительской задачи находится почти в той же структуре / пути к папке, что и мое приложение

Я получаю соответствующую ошибку: " System.UnauthorizedAccessException: Доступ к пути 'C: \ WINDOWS \ system32 \ CAISLog.csv' запрещен. "

Мой обходной путь - просто определить местоположение моего файла. Однако я хочу понять: «Что такое правило .NET, которое определяет способ разрешения пути, когда во время ввода-вывода указывается только имя файла?» Мне кажется, что мне не хватает какой-то базовой концепции, и это мне плохо.

edit - я не уверен, что это правило .NET само по себе, но Шмули, кажется, объясняет концепцию немного яснее. Я обязательно попробую предложения Роба Пруза в будущем, так что +1 тоже.

Если у кого-то есть предложения по переписыванию, которые подчеркивают, что я не на самом деле заботится о поиске пути к моему .exe - скорее просто не понимает, что происходит с относительным разрешением пути (и Я все еще могу испортить мою терминологию) ...

Ответы [ 4 ]

11 голосов
/ 06 ноября 2008

Когда приложение (WinForms) запускается, Environment.CurrentDirectory содержит путь к папке приложения (то есть папке, содержащей сборку .exe). Использование любого из файловых диалогов, напр. OpenFileDialog, SaveFileDialog и т. Д. Приведет к изменению текущего каталога (если была выбрана другая папка).

При запуске службы Windows ее содержащей папкой является C: \ Windows \ System32, так как это папка System, и именно System (т.е. операционная система) фактически выполняет вашу службу Windows.

Обратите внимание, что указание относительного пути в большинстве объектов System.IO приведет к использованию свойства Environment.CurrentDirectory.

Как уже упоминалось, есть несколько способов получить путь к исполняемому файлу службы, используя Assembly.GetEntryAssembly() или Assembly.GetExecutingAssembly() и затем используя свойство Location или свойство CodeBase (имейте в виду, что это файл путь, а не каталог исполняемого файла).

Другой вариант - использовать:

`System.IO.Directory.SetCurrentDirectory( System.AppDomain.CurrentDomain.BaseDirectory );`

Выполните вызов в методе OnStart Службы, применив его ко всему приложению.

9 голосов
/ 05 ноября 2008

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

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

Assembly ass = Assembly.GetEntryAssembly();
string dir = Path.GetDirectoryName(ass.Location);
string filename = Path.Combine( dir, "CAISLog.csv" );

Предполагается, что входная сборка находится там, где находится ваш файл. Если нет, вы можете изменить получение сборки на что-то вроде;

Assembly ass = Assembly.GetAssembly( typeof( AClassInYourAssembly ) );
4 голосов
/ 05 ноября 2008

Разрешение относительного пути никогда не работает с путем запуска исполняемого файла. Он всегда работает против текущего каталога процесса, и вы не можете ожидать, что он всегда будет установлен в каталог, в котором находится .exe.

Если вам нужно такое поведение, позаботьтесь о том, чтобы самостоятельно найти правильный путь и предоставить полный путь к операциям с файлами.

0 голосов
/ 05 ноября 2008

Вы можете использовать это, чтобы указать путь, который находится на том же пути вашего exe @ ".. \ CAISLog.csv". Обратите внимание, что двойные точки относятся к родительскому каталогу, где всегда находится ваш .exe файл.

RWendi

...