Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018

Как сделать чтобы OpenFileDialog не менял Environment.CurrentDirectory

13.04.2012, 18:49. Показов 4327. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Такая проблема. Есть программа, в которой во время работы множество раз открываются и закрываются разные файлы, что находятся в папке программы(ну или на уровень ниже). В моем коде я, понятное дело, прописываю относительный путь типа такого:
C#
1
Stream stream = new FileStream("cookies.bin", FileMode.Create, FileAccess.Write, FileShare.None);
но в программе также используются диалоги открытия файлов OpenFileDialog, и проблема в том, что когда этот диалог для выбора файла открывается, то папка, открытая в опендиалоге, делается текущей директорией программы. Например, у меня текущая папка до открытия диалога была вот такая:
C:\Program Files\DIFX
Но тут я нажимаю кнопку "Обзор" и открывается OpenFileDialog в папке D:\. И для программы текущей папкой стает тоже диск D. Если буду в этом диалоге переходить по папкам, то и текущая папка будет сразу же меняться синхронно с тем, как я буду ходить по директориям. Но в это время моя программа пытается открыть файл из своей папки "cookies.bin", но так как текущая папка вовсе не папка программы, а диск D, то программа указанного файла не находит, в следствии чего получаем исключения и другие ошибки.

Как сделать так, чтобы OpenFileDialog не менял Environment.CurrentDirectory?

Добавлено через 14 минут
И свойство FileDialog.RestoreDirectory в данном случае не решает проблему... Так как во время открытого файл-диалога текущая папка всеравно меняется... И если пользователь будет деражть открытым файл-диалог например несколько минут, а программа за это время попытается открыть несколько десяток раз файлы, то можно наломать много дров
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.04.2012, 18:49
Ответы с готовыми решениями:

Неправильная работа Environment.CurrentDirectory
В приложении редко выбрасывает ошибку "Нет доступа к файлу...." По пути: C:\Programm Files(x86)\Microsoft Visual...

Как сделать, чтобы EditText менял значение TextView?
На экране есть поле для ввода текста (EditText), кнопка для принятия введенного текста и поле с текстом (TextView) Нужно сделать так,...

Как сделать, чтобы родительский блок менял размеры в зависимости от содержимого?
Доброго времени суток! Возник такой вопрос. Как сделать, чтоб родительский блок автоматически изменял размеры при добавлении дочерних...

7
I ♥ C#
 Аватар для Delog
470 / 262 / 25
Регистрация: 07.05.2010
Сообщений: 567
13.04.2012, 19:09
Я никогда не полагаюсь на CurrentDirectory, поскольку оно может указывать не обязательно на папку с программой, например, при старте программы из автозагрузки, или при создании ярлыка с прописанной текущей директорией, или еще каких-нибудь загадочных обстоятельствах. Поэтому, лучше всего в конструкторе окна сохранить путь к программе и потом использовать его везде где нужно.
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
13.04.2012, 19:18  [ТС]
Цитата Сообщение от Delog Посмотреть сообщение
Я никогда не полагаюсь на CurrentDirectory, поскольку оно может указывать не обязательно на папку с программой, например, при старте программы из автозагрузки, или при создании ярлыка с прописанной текущей директорией, или еще каких-нибудь загадочных обстоятельствах. Поэтому, лучше всего в конструкторе окна сохранить путь к программе и потом использовать его везде где нужно.
дааа.. наверное придется так и делать... А на счет автозагрузки - я этот момент знал, и потому при старте программы в конструкторе формы всегда помещал такой код:
C#
1
Environment.CurrentDirectory = Application.StartupPath;
Но теперь вижу, что от этого CurrentDirectory лучше вообще отказаться)

Добавлено через 5 минут
Кстати, есть вопрос о производительности. Допустим, у меня очень часто открываются разнообразные файлы, то что будет быстрее работать, это:
C#
1
2
3
4
5
6
7
8
string currentDirectory = Application.StartupPath;
StreamWriter sr;
for(int i = 0; i < 1000; i++)
{
        sr = new StreamWriter(currentDirectory + i + ".txt");
        sr.Write(i.ToString());
        sr.Close();
}
или это?
C#
1
2
3
4
5
6
7
StreamWriter sr;
for(int i = 0; i < 1000; i++)
{
        sr = new StreamWriter(Application.StartupPath + i + ".txt");
        sr.Write(i.ToString());
        sr.Close();
}
0
I ♥ C#
 Аватар для Delog
470 / 262 / 25
Регистрация: 07.05.2010
Сообщений: 567
13.04.2012, 20:02
Первый вариант быстрее, поскольку выполнится всего один запрос к свойству, в то время как в цикле он будет выполняться тысячу раз, причем вот что будет происходить при чтении этого свойства:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static string StartupPath
{
    get
    {
        if (Application.startupPath == null)
        {
            StringBuilder stringBuilder = new StringBuilder(260);
            UnsafeNativeMethods.GetModuleFileName(NativeMethods.NullHandleRef, stringBuilder, stringBuilder.Capacity);
            Application.startupPath = Path.GetDirectoryName(stringBuilder.ToString());
        }
        new FileIOPermission(FileIOPermissionAccess.PathDiscovery, Application.startupPath).Demand();
        return Application.startupPath;
    }
}
Кстати, Application.StartupPath может указывать на сборку в кэше при определенных обстоятельствах, так что лучше, думаю извлекать путь из нулевого аргумента командной строки.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.04.2012, 20:50
Tolias28, у класса OpenFileDialog есть свойство RestoreDirectory, которое можно выставить в дизайнере. Если оно true, то при закрытии диалог восстановит текующую рабочую папку.
Однако, рабочую папку может изменить и другое приложение, так что на этот метод расчитывать не стоит.
Да и вообще не стоит при создании путей предполагать, что рабочая папка будет являться папкой запуска приложения.
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
14.04.2012, 23:05  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Tolias28, у класса OpenFileDialog есть свойство RestoreDirectory, которое можно выставить в дизайнере. Если оно true, то при закрытии диалог восстановит текующую рабочую папку.
Цитата Сообщение от Tolias28 Посмотреть сообщение
И свойство FileDialog.RestoreDirectory в данном случае не решает проблему... Так как во время открытого файл-диалога текущая папка всеравно меняется... И если пользователь будет деражть открытым файл-диалог например несколько минут, а программа за это время попытается открыть несколько десяток раз файлы, то можно наломать много дров
.....

Добавлено через 14 минут
Цитата Сообщение от Delog Посмотреть сообщение
Кстати, Application.StartupPath может указывать на сборку в кэше при определенных обстоятельствах, так что лучше, думаю извлекать путь из нулевого аргумента командной строки.
это в C++ нулевой аргумент - путь к исполняемому файлу. В C# же нулевой аргумент не хранит пути. Или я ошибаюсь?

Цитата Сообщение от Delog Посмотреть сообщение
Application.StartupPath может указывать на сборку в кэше при определенных обстоятельствах
Можно об этом поподробнее пожалуйста.
0
I ♥ C#
 Аватар для Delog
470 / 262 / 25
Регистрация: 07.05.2010
Сообщений: 567
15.04.2012, 19:22
Цитата Сообщение от Tolias28 Посмотреть сообщение
это в C++ нулевой аргумент - путь к исполняемому файлу. В C# же нулевой аргумент не хранит пути. Или я ошибаюсь?
Нулевой аргумент содержит полное имя файла, включая диск и все каталоги.
C#
1
Environment.GetCommandLineArgs()[0]
Цитата Сообщение от Tolias28 Посмотреть сообщение
Можно об этом поподробнее пожалуйста.
msdn: This path will be different depending on whether the Windows Forms application is deployed using ClickOnce. ClickOnce applications are stored in a per-user application cache in the C:\Documents and Settings\username directory. For more information, see Accessing Local and Remote Data in ClickOnce Applications
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
15.04.2012, 19:42  [ТС]
Цитата Сообщение от Delog Посмотреть сообщение
Нулевой аргумент содержит полное имя файла, включая диск и все каталоги.
C#
1
Environment.GetCommandLineArgs()[0]
пардон... Я вас неправильно понял Я пытался вот так получить доступ к нулевому аргументу:
C#
1
2
3
4
5
static void Main(string[] args)
        {
            Console.WriteLine(args[0]);
            Console.ReadKey();
        }
В результате получал IndexOutOfRangeException

Короче спасибо за помощь и ответы!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2012, 19:42
Помогаю со студенческими работами здесь

Как сделать, чтобы при наведении курсора на Label, он менял цвет?
Доброго времени суток! Как сделать, чтобы при наведении курсора на Label, он менял цвет? Пишу : void __fastcall...

как сделать чтобы объект(квадрат) менял цвет когда он движется?
как сделать чтобы объект(квадрат) менял цвет когда он движется?

Как сделать, чтобы проводник не менял названия папок Users->Пользователи и т.д
Просто со времён виндовс 98 у меня &quot;Мои документы&quot; лежат в D:\_My_Doc и я привык видеть именно эту папку, самую первую на диске D и...

как сделать так чтобы массив считал/менял при нажатие буквы?
я вроде освоил работу с массивами и применяю ее во всех заданиях какие есть у меня.только мне всегда приходится вводить начальное число...

Как сделать так, чтобы при наведении мыши на обьект он менял цвет?
собственно как цвет задать и как событие мыши преехватить, я знаю, вроде получается. но вот это: public void mousePressed(MouseEvent...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru