Путь по умолчанию OpenFileDialog
using (var openFileDialog1 = new OpenFileDialog())
{
openFileDialog1.Reset();
if (!string.IsNullOrEmpty(ExcelFilePath))
{
string fileName = Path.GetFileName(ExcelFilePath);
string fileExt = Path.GetExtension(ExcelFilePath);
//Avoid "you can't open this location using this program file" dialog
//if there is a file name in the path strip it )
if (!string.IsNullOrEmpty(fileName))
initialDirectory = Path.GetDirectoryName(ExcelFilePath);
//if not let it be
else
initialDirectory = ExcelFilePath;
openFileDialog1.InitialDirectory = initialDirectory;
}
else
openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.Filter = "Excel files (*.xls or *.xlsx)|*.xls;*.xlsx";
//openFileDialog1.Filter = "xls files (*.xls)|*.xls|xlsx files(*.xlsx)|.xlsx";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = false;
openFileDialog1.CheckFileExists = true;
openFileDialog1.CheckPathExists = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
var browseSelectionMade = BrowseSelectionMade;
if (browseSelectionMade!=null)
browseSelectionMade(this, new DataEventArgs<string>(openFileDialog1.FileName));
}
}
Независимо от того, устанавливаю ли RestoreDirectory значение true, я всегда буду искать в LAST используемой директории, если мой исходный каталог установлен в путь, который не существует. Где последний использованный каталог, сохраненный OpenFileDialog? И есть ли способ отменить это поведение? (например, я всегда хочу установить его в C: \, если исходная директория не существует?)
Ответы
Ответ 1
Где сохранен последний использованный каталог?
Он хранится в реестре. Точное местоположение зависит от версии Windows, для Win7 это HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32. Быстрый взгляд с regedit должен убедить вас в том, что вы не хотите связываться с этим.
Простым обходным путем является предоставление допустимого пути. Если тот, который вы вычисляете, недействителен, Directory.Exists возвращает false, а затем предоставляет допустимый. Как и папка Documents, возвращаемая Environment.GetFolderPath(). Опять же, ничего плохого в том, что последний из них не используется, пользователь легко распознает его с хорошими шансами, что он близок к желаемому.
Ответ 2
Кажется, что все, что вам нужно сделать, это следующее:
string path; // this is the path that you are checking.
if(Directory.Exists(path)) {
openFileDialog1.InitialDirectory = path;
} else {
openFileDialog1.InitialDirectory = @"C:\";
}
То есть, если я что-то не хватает.
Ответ 3
Я не думаю, что для этого есть что-то построенное. Перед тем, как открыть диалог, просто проверьте:
if (!Directory.Exists(initialDirectory))
{
openFileDialog1.InitialDirectory = @"C:\";
}
Ответ 4
Кроме того, чтобы установить расширение по умолчанию, вы должны установить свойство FilterIndex вместо DefaultExt. см. fooobar.com/questions/346789/...
Вот хорошая статья о OpenFileDialog в С#: http://www.c-sharpcorner.com/uploadfile/mahesh/openfiledialog-in-C-Sharp/
Ответ 5
Проверьте, существует ли файл ExcelFilePath, вы проверяете, является ли он пустым или пустым, однако если перед вашим блоком вы проверяете, существует ли каталог, и если это не reset значение для пустой строки вы должны быть золотыми.
(да, вам нужно будет применить логику имени файла и т.д. раньше), но как только вы разобрали все это, тривиально определить, выходит ли каталог
if (!Directory.Exists(excelPath))
{
ExcelFilePath = String.Empty;
}
Ответ 6
Если вы используете имя файла, хранящееся в некоторой строке, лучше использовать Path для вырезания имени файла (на моем W10 диалог открытия не открывается в исходном каталоге, если я предоставляю только имя файла):
if (!System.IO.Directory.Exists(filename))
{
openDlg.InitialDirectory =
System.IO.Path.GetDirectoryName(filename);
}
Ответ 7
В будущем я
не забудьте сделать:
try
{
result = dialog.ShowDialog(Window);
}
catch
{
dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
result = dialog.ShowDialog(Window);
}
Это помогает в ситуации, когда пользователь открыл файл из местоположения, который больше не существует (например, USB-накопитель, подключенный сетевой диск). ShowDialog выдает исключение, если InitialDirectory недействителен.