Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > StreamWriter директория для записи


Автор: IGV 25.9.2010, 16:40
Столкнулся с неожиданной и совершенно непонятной для меня проблемой.
Приведу пример кода и дам комментарии.
Создаем консольное приложение:
Код

using System;
using System.IO;

Код

        [STAThread]
        static void Main()
        {
            using (StreamWriter writer = new StreamWriter("test_console0.txt"))
            {
                writer.WriteLine("test");
                writer.Close();
            }

            using (StreamWriter writer = new StreamWriter("C:\\temp\\test_console1.txt"))
            {
                writer.WriteLine("test");
                writer.Close();
            }

            using (StreamWriter writer = new StreamWriter("test_console2.txt"))
            {
                writer.WriteLine("test");
                writer.Close();
            }

            var saveFileDialog = new System.Windows.Forms.SaveFileDialog();
            saveFileDialog.ShowDialog();
            if (!string.IsNullOrEmpty(saveFileDialog.FileName))
            {
                using (StreamWriter writer = new StreamWriter(saveFileDialog.FileName))
                {
                    writer.WriteLine("test");
                    writer.Close();
                }
            }

            using (StreamWriter writer = new StreamWriter("test_console4.txt"))
            {
                writer.WriteLine("test");
                writer.Close();
            }
        }

Файл test_console0.txt - был создан в той же директории, где лежит exe'шник.
Файл test_console1.txt - был создан в директории "C:\temp\".
Файл test_console2.txt - был создан в той же директории, где лежит exe'шник.
Файл test_console3.txt (файл, указанный с помощью SaveFileDialog) - был создан в выбранной в SaveFileDialog директории. (в тестовом примере - "Рабочий стол").
Файл test_console4.txt - был создан в выбранной в SaveFileDialog директории. (в тестовом примере "Рабочий стол").

А теперь вопрос:
Почему файл test_console4.txt был создан не в директории, где лежит exe'шник?

Автор: CYBERDREAM 25.9.2010, 16:56
Если хочешь навярняка сохранять рядом с ехе, то используй Application.StartupPath или что то вроде того, если консоль, то  System.Reflection.Assembly.GetExecutingAssembly().Location

По идее у тебя Environment.CurrentDirectory сбивается после вызова SaveFileDialog. Хотя у меня данны код сохранил консоль4 рядом с ехе

Автор: IGV 25.9.2010, 17:03
При создании объекта StreamWriter, если в конструктор передается, только имя файла (fileName), то StreamWriter определяет полный путь до файла так:
Код

string fullPath = System.IO.Directory.GetCurrentDirectory() + fileName;

SaveFileDialog изменяет значение
Код

System.IO.Directory.GetCurrentDirectory();

на то, которое использовалось при сохранении.
Чтобы изменения не происходило необходимо "выставить" свойство
Код

FileDialog.RestoreDirectory = true

По умолчанию
Код

FileDialog.RestoreDirectory = false

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