Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Проблема с путями при сохранении файлов


Автор: Elfet 29.4.2007, 17:46
Код работал нормально до того как я начал использовать openFileDialog smile
Код

            try
            {
                Directory.SetCurrentDirectory(System.Environment.CurrentDirectory);
                if (Directory.Exists("\\Data\\" + System.Environment.UserName))
                {
                    using (XmlTextWriter writer = new XmlTextWriter(".\\Data\\" + System.Environment.UserName + "\\Config.xml", Encoding.UTF8))
                    {

Если я в программе не открываю openFileDialog то всё нормально. Но если я запускаю его, то вот тут: 
Код

XmlTextWriter writer = new XmlTextWriter(".\\Data\\" + System.Environment.UserName + "\\Config.xml", Encoding.UTF8)

возникает ошибка: пишет что не может найти "путь до папки из которой открывал  openFileDialog\Data\Elfet\Config.xml"
А мне нужно что бы сохранилось всё в папку по относительному пути .\Data\Elfet\ к моей программе. В папке где находится программа есть папка Data\Elfet

Автор: tol05 29.4.2007, 22:09
А почему бы тебе не использовать конструкцию:
Код

string destPath = Assembly.GetExecutingAssembly.ManifestModule.Assembly.Location + "\Data\Elfet\";


или
Код

string destPath = Assembly.GetExecutingAssembly.ManifestModule.Assembly.Location + "\Data\";
XmlTextWriter writer = new XmlTextWriter(destPath + System.Environment.UserName + "\\Config.xml", Encoding.UTF8)


Дело в том, что, как я почитал MSDN, System.Environment.CurrentDirectory указывает на текущую рабочую директорию (с которой взаимодействует поток выполнения),она в процессе работы может меняться.
Assembly.GetExecutingAssembly.Location - путь к текущей выполняемой сборке. Если их будет несколько, и в разных папках, то время от времени тоже путь будет меняться, в зависимости от того, код какой сборки выполняется.
Assembly.GetExecutingAssembly.ManifestModule.Assembly.Location - путь к сборке, которая содержит манифест. Она одна, думаю, это неплохо smile

Автор: Elfet 29.4.2007, 23:28
Цитата(tol05 @  29.4.2007,  23:09 Найти цитируемый пост)
System.Environment.CurrentDirectory указывает на текущую рабочую директорию (с которой взаимодействует поток выполнения),она в процессе работы может меняться.

А в каком случае она меняется? Может если я не собираюсь трогать ничего такого, можно работать с этой штукой?

Добавлено через 2 минуты и 50 секунд
Юзать вот так?
Код

myPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Assembly.Location);

Автор: AndZho 30.4.2007, 09:46
Можно еще так:

Код

 DirectoryInfo ApplicationDirectory = new System.IO.DirectoryInfo(".");

далее
Код

ApplicationDirectory.FullName+@"\"+...

Автор: tol05 30.4.2007, 10:02
Нет, AndZho, не то. 
"." тоже каждый раз меняется, в зависимости от того, где находится папка, с которой работает процесс.

Хотел в инете найти описание моих вариантов, да что-то не прет. Особенно по System.Environment.CurrentDirectory.
Но можно подебагать и просто посмотреть.
Или поверьте на слово smile


Elfet, 
Код

myPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Assembly.Location);


да, это оно.

Автор: AndZho 30.4.2007, 10:12
Цитата(Elfet @ 29.4.2007,  16:46)
А мне нужно что бы сохранилось всё в папку по относительному пути .\Data\Elfet\ к моей программе. В папке где находится программа есть папка Data\Elfet

Вариант 
Код

 DirectoryInfo ApplicationDirectory = new System.IO.DirectoryInfo(".");
 ApplicationDirectory.FullName + @"\Data\Elfet\"

вроде будет делать то что тебе нужно. Или я чего то не догоняю.

Автор: archeg 30.4.2007, 20:15
Цитата(AndZho @  30.4.2007,  10:12 Найти цитируемый пост)
Вариант 
Код

 DirectoryInfo ApplicationDirectory = new System.IO.DirectoryInfo(".");
 ApplicationDirectory.FullName + @"\Data\Elfet\"

вроде будет делать то что тебе нужно. Или я чего то не догоняю. 

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

Directory.SetCurrentDirectory 

задает текущий каталог. Если не ошибаюсь какая-то винда могла устанавливать в свойствах ярлычка рабочий каталог - это он и есть. У меня ща виста - она такое не умеет.

Автор: Naum 2.5.2007, 12:52
Цитата(tol05 @  29.4.2007,  23:09 Найти цитируемый пост)
Assembly.GetExecutingAssembly.ManifestModule.Assembly.Location

А чем хуже System.Windows.Application.StartUpPath?

Автор: tol05 2.5.2007, 15:52
Еле нашел в MSDN. 
Не знаю как у других, а у меня (MSDN for VS codename Orcas) класс System.Windows.Application свойства StartUpPath почему-то не содержит. А содержится оно почему-то в Microsoft.Office.Interop.Excel._Application interface. Это мне уже не нравится smile
Да и библиотека presentationframework.dll с этим классом тоже наверняка не у каждого обнаружится. Как понимаю это для Framework-а 3.0? Короче, проблемы уже здесь.

Почитал я о  System.Windows.Application классе. Но ведь он предназначен для 
Цитата

windows and dialog boxes!
 А если у меня консолька или dll? Не понравилось и это smile

А так больше ничего не скажу, вроде прикольный класс. Спасибо за инфу, кстати.

Автор: Void 2.5.2007, 16:30
По-моему, Naum имел в виду System.Windows.Forms.Application.
System.Windows.Application (как и всё пространство имён System.Windows) действительно относится к .NET 3.0, конкретно, к WPF.

Автор: Naum 2.5.2007, 17:09
Цитата(Void @  2.5.2007,  17:30 Найти цитируемый пост)
По-моему, Naum имел в виду System.Windows.Forms.Application.

Точно. Прошу прощения за очепятку.
Цитата(tol05 @  2.5.2007,  16:52 Найти цитируемый пост)
А если у меня консолька или dll?

Не раз уже проверялось, ничто не мешает вызывать System.Windows.Forms.Application.StartUpPath и в этих случаях.   smile  Это раз.
Второе, все равно, если хотим пользовать [Open|Save]FileDialog, без пространства имен System.Windows.Forms никак не обойтись. 

Автор: tol05 2.5.2007, 18:28
Цитата

если хотим пользовать [Open|Save]FileDialog, без пространства имен System.Windows.Forms никак не обойтись. 

Это конечно. Просто System.Windows.Application запутало, а мозги у меня и без того слабые  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)