Путь по умолчанию 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:\";
}

Ответ 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 недействителен.