Подтвердить что ты не робот

Установка начального каталога SaveFileDialog?

Мне нужен SaveFileDialog со следующим поведением:

  • В первый раз, когда вы его открываете, он переходит в "Мои документы".

  • Затем он переходит к последней выбранной папке. Какой лучший способ достичь этого?

Если я не устанавливаю InitialDirectory, он переходит в каталог exe - чего я не хочу. Он запоминает последний выбранный каталог, хотя - даже между исполнением.

Если я устанавливаю InitialDirectory, он не запоминает последний выбранный каталог. Конечно, я мог бы сохранить последний выбранный каталог в реестре:( но я ищу лучшее решение.

      SaveFileDialog dialog = new SaveFileDialog();
      //??? dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
      dialog.ShowDialog();

Любые советы?

4b9b3361

Ответ 2

Я понятия не имею, почему это работает, но я, наконец, смог заставить его работать для меня.

Я обнаружил, что если бы я дал полный путь, это не сработало бы, но если бы я ввел этот полный путь внутри Path.GetFullPath(), тогда он сработает. Глядя на значения до и после, они кажутся одинаковыми, но без него он будет работать без работы и работать с ним.

//does not work
OpenFileDialog dlgOpen = new OpenFileDialog();
string initPath = Path.GetTempPath() + @"\FQUL";
dlgOpen.InitialDirectory = initPath;
dlgOpen.RestoreDirectory = true;

//works
OpenFileDialog dlgOpen = new OpenFileDialog();
string initPath = Path.GetTempPath() + @"\FQUL";
dlgOpen.InitialDirectory = Path.GetFullPath(initPath);
dlgOpen.RestoreDirectory = true;

Ответ 3

Обязательно проверьте, существует ли путь к каталогу перед установкой свойства Начальная директория. Создайте каталог, если он не существует. то есть

if (!Directory.Exists(FooDirectory))
{
     Directory.CreateDirectory(FooDirectory);
}

Ответ 4

Я тоже пробовал разные "решения", найденные в разных местах, но никто из них, похоже, не работает, как только в реестре есть запись в списке MRU:/Но вот мое собственное проворное обходное решение...

Вместо установки свойства диалога InitialDirectory установите для свойства FileName свой путь, но в сочетании с выбранным Filter, например:

dialog.FileName = Path.Combine(myPath, "*.*");

Ответ 5

Ни один из предоставленных решений не работал у меня печально.

В дополнение к спецификациям OP я хотел, чтобы программа запоминала последнее место сохранения между прогонами. Для этого в Visual Studio Solutions Explorer под ProjectName -> Properties -> Settings.settings, я устанавливаю следующее свойство:

Свойство settings.settings: Name = PreviousPath, Type = string, Scope = Пользователь, оставить значение пустой

Поскольку я поддерживаю SaveFileDialog в течение всего времени работы программы, я создаю экземпляр в начале. Затем в Command для отображения диалога:

if (string.IsNullOrEmpty(Settings.Default.PreviousPath))
{
    this.saveDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
}
else
{
    this.saveDialog.InitialDirectory = Settings.Default.PreviousPath;
}

this.saveDialog.FileName = "Default_File_Name";

bool result = this.saveDialog.ShowDialog() ?? false;

if (result)
{
    Settings.Default.PreviousPath = Path.GetDirectoryName(this.saveDialog.FileName);
    Settings.Default.Save();

    // Code writing to the new file...
}

Это дает поведение:

  • При первом запуске программы и открытии диалога он переходит к "Мои документы".
  • Последовательные прогоны и диалог открыты:
    • Если сохранено в предыдущем открывшемся, оно переходит в предыдущее место сохранения.
    • Если он не сохранен в предыдущем открывшемся, переходите к "Мои документы".

Ответ 6

Рекомендуемые обходные пути для меня не сработали, поэтому после нахождения Как WPF OpenFileDialog отслеживает каталог последнего открытого файла? Я реализовал:

public static void SetInitialDirectory(this FileDialog dlg, string fileExtension, string initialDirectory)
        {
            // RestoreDirectory doesn't seem to be implemented - /questions/177866/how-does-wpf-openfiledialog-track-directory-of-last-opened-file
            // so manually only set InitialDirectory if nothing is stored
            try
            {
                var mru = @"Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSavePidlMRU\" + fileExtension;
                var rk = Registry.CurrentUser.OpenSubKey(mru);
                if (rk == null)
                {
                    dlg.InitialDirectory = initialDirectory;
                }
            }
            catch (Exception)
            {
                // SecurityException, ObjectDisposedException => allow default behaviour
            }
        }

Это будет использовать предоставленный initialDirectory, если ранее это диалоговое окно не использовалось для этого расширения файла. После того, как диалог был использован, он возвращается к поведению по умолчанию, помня о предыдущем каталоге.

Ответ 7

Я обнаружил, что настройка InitialDirectory на null сначала работает с историей пользователя.

    OpenFileDialog dlgOpen = new OpenFileDialog();
    dlgOpen.InitialDirectory = null;
    dlgOpen.InitialDirectory = @"c:\user\MyPath";

Ответ 8

Я провел некоторое тестирование с .NET 2.0, и кажется, что если я устанавливаю FileName на что-либо другое, кроме строковой строки, это не сработает. Когда я использую метод или accesstor для установки свойства, исходный каталог игнорируется.

Ответ 9

Если вы используете косую черту в любом месте вашего пути, InitialDirectory не работает. Убедитесь, что они конвертированы в обратные косые черты

Ответ 10

savefiledialog.InitialDirectory = Application.StartupPath;
savefiledialog.RestoreDirectory = true;

протестирован второй раз.

Ответ 11

Это то, с чем я закончил, что согласуется с тем, где OP хотел указать свой диалог:

Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.InitialDirectory = null;

// May or may not want "saves", but this shows how to append subdirectories
string path = (Path.Combine(Environment.ExpandEnvironmentVariables("%USERPROFILE%"), "My Documents") + "\\saves\\");  

if (!Directory.Exists(path))
    Directory.CreateDirectory(path);

dlg.InitialDirectory = path;
dlg.RestoreDirectory = true;

if (dlg.ShowDialog().Value == true)
{
    // This is so you can have JUST the directory they selected
    path = dlg.FileName.Remove(dlg.FileName.LastIndexOf('\\'), dlg.FileName.Length - dlg.FileName.LastIndexOf('\\'));

    string filePath = Path.Combine(path, fileName);

    // This is "just-in-case" - say they created a new directory in the dialog,
    // but the dialog doesn't seem to think it exists because it didn't see it on-launch?
    if (!Directory.Exists(path))
        Directory.CreateDirectory(path);

    // Remove a file if it has the same name
    if (File.Exist(filePath))
        File.Delete(filePath);

    // Write the file, assuming you have and pass in the bytes
    using (FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write)
    {
        fs.Write(bytes, 0, (int)bytes.Length);
        fs.Close();
    }
}

Ответ 12

Просто хотел втянуться в эту дискуссию (пару лет слишком поздно), так как у меня была и точная проблема. Несмотря на то, что можно предположить, что это поведение - то есть использование пути по умолчанию в первый раз, а затем и предыдущий выбранный путь после этого - может быть достигнуто с помощью свойств и функций openFileDialog, просто невозможно (в настоящее время)!

Можно изменить рабочий каталог на желаемый путь по умолчанию (например, Environment.CurrentDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);) но некоторые рамки, такие как Unity, не очень нравятся и заканчиваются.

Из-за этого я закончил с этим кодом:

private bool firstDialogOpened = true;

public void BrowseFiles()
{
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "Model files (*.obj)|*.obj|All files (*.*)|*.*";
    openFileDialog.FilterIndex = 1;

    if (firstDialogOpened)
    {
        openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        firstDialogOpened = false;
    }

    if (openFileDialog.ShowDialog() == DialogResult.OK)
        filepath.text = openFileDialog.FileName;
}

Это дает мне желаемое поведение, хотя я бы любил более элегантное решение.

Ответ 13

'Что касается сохранения выходного файла в нужный каталог в vb.net, "следующим образом я обнаружил, что работал как шарм:

Dim filcsv As String = fileNamey.Replace(".txt", "_Denied2.csv")
Dim filcsv2 As String = fileNamey.Replace(".txt", "_Approved2.csv")

Dim outputDirectory As String = "C:\Users\jlcmil\Documents\EnableMN\output\"
Dim totalPath As String = System.IO.Path.Combine(outputDirectory, filcsv)
Dim totalPath2 As String = System.IO.Path.Combine(outputDirectory, filcsv2)

Dim outDenied As StreamWriter = New StreamWriter(totalPath)
Dim outApproved As StreamWriter = New StreamWriter(totalPath2)