Путь к программе под Windows XP (программа C #) - PullRequest
0 голосов
/ 07 октября 2011

Моя программа отлично работает на Windows 7 / Vista и большинстве Windows XP, на которых я тестировал. Я открываю файл, который является 1 каталог под самой программой. Это Administration \ adm.txt (это именно тот каталог, который я использую). Я использую .NET 2.0 для моего проекта. Я попытался запустить свою программу на старой Windows XP (на которой был установлен .NET 2.0), и я получил самую странную ошибку, которую я когда-либо видел в своей жизни. Программа работает нормально, пока пользователь не откроет диалог открытия файла. После этого программа начала думать, что она находится в каталоге, где в последний раз находился диалог открытия файла. Поэтому, если последний раз диалоговое окно открытия файла просматривалось в C: \ Мои документы \, и я пытаюсь открыть файл Administration \ adm.txt, я получаю исключение, что "C: \ Мои документы \ Administration \ adm.txt" не существует. К сожалению, я не могу снова использовать этот компьютер, но мне бы очень хотелось узнать, как это произошло. У кого-нибудь есть идеи?

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Стандартное поведение в Windows - для файловых диалогов изменить текущий каталог приложения.Вы можете предотвратить это с помощью флага OFN_NOCHANGEDIR для структуры OPENFILENAME , которая используется для настройки диалогов open и save .

Для историисм. блог Old New Thing:

http://blogs.msdn.com/b/oldnewthing/archive/2010/11/12/10089878.aspx

0 голосов
/ 07 октября 2011

Помимо ответа Тинмана, я добавлю, что не рекомендуется использовать каталог относительно текущего каталога, потому что другие процессы (включая ваш собственный, как вы видели) могут изменять текущий каталог. Следующий код является более надежным способом создания имени файла в каталоге под каталогом вашей программы:

string exeDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string fileName = System.IO.Path.Combine(exeDirectory, System.IO.Path.Combine("Administration", "adm.txt"));
...