2013-02-20 4 views
1

У меня есть объект журнала, который записывает ежедневные файлы журнала с относительным путем. Это довольно просто (.NET 4.0, VS 2010).Относительная смена пути?

public void LogLine(string txt) 
{ 
    DateTime dt = DateTime.Now; 
    if (CurrentDay != dt.Day) 
    { 
     string newFileName = "..\\Log\\" + programName + dt.Day + ".log"; 
     fs = new FileStream(newFileName, FileMode.Create, FileAccess.Write); 
     sw = new StreamWriter(fs); 
     CurrentDay = dt.Day; 
    } 
    sw.WriteLine(txt); 
} 

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

C: \ MYFILES \ Log \ MyApp19.log

После использования программы некоторые и позволить ему работать на ночь, так новый файл и поток создается (на первом входе после полуночи), я вернусь к DirectoryNotFoundException о том что-то вроде:

C: \ MyFiles \ MyOtherFiles \ Resources \ Log \ MyApp20.log

Единственное, что я могу придумать, это: я использую OpenFileDialog и SaveFileDialog пару раз на протяжении всего срока службы программного обеспечения, и один из этих диалогов открытия/сохранения получает доступ к файлу в пределах

C: \ MyFiles \ MyOtherFiles \ Resources \ SavedFiles \

Так что, мне кажется, что, когда я использую диалоговые окна, я открываю/сохранить что-то в SavedFiles каталог и когда он создает новый журнал, относительный путь к файлу .. \ до Ресурсы (от Сохраненные файлы), то не можете найти d Справочник Журнал в пределах Ресурсы и выдает исключение. Однако я не могу воспроизвести проблему, используя диалоги, и я думал, что относительный путь относительно исполняемого файла? Могут ли диалоги Open/Save File изменять, как программное обеспечение вычисляет относительный путь к файлу? У кого-нибудь есть мысли? Спасибо за ваше время!

+1

Посмотрите на этот вопрос [] (http://stackoverflow.com/questions/930816/why-does-openfiledialog-change-my- рабочий каталог). Рабочий каталог изменяется при использовании 'OpenFileDialog'. – HuorSwords

+1

@HuorSwords Спасибо, я был наивен термину «рабочий каталог». Что мне интересно, если я печатаю Directory.GetCurrentDirectory() до и после моих диалогов, оба отпечатка идентичны. Однако проблема, безусловно, исходит из одного из диалогов. Я уверен, что восстановление каталога будет работать, но это раздражает, чтобы не удалось воспроизвести проблему, которая у меня есть! – Softerware

ответ

3

Alng я думаю, что следующая ссылка может помочь вам:

http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.aspx

Обратите внимание на следующие части:

Важно: Если пользователь приложения изменяет папку FileDialog, то текущий рабочий каталог для вашего приложения будет установлен в местоположение, указанное в FileDialog. Чтобы этого не произошло, установите для свойства RestoreDirectory значение true.

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

Это может помочь вам также http://msdn.microsoft.com/en-us/library/system.windows.forms.application.executablepath.aspx

рассматривает

2

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

var assembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly(); 
var path = Path.GetDirectoryName(assembly.Location); 
newFileName = Path.Combine(path, "..\\Log\\" + programName + dt.Day + ".log"); 
1

Я предполагаю, что приложение меняет текущий рабочий каталог в какой-то момент. В результате на этой основе я бы использовал полностью квалифицированный путь для файла журнала. Вы можете использовать путь запуска сборки, например Application.StartupPath, который не должен меняться, даже если приложение по каким-либо причинам меняет папки.

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