Ответ 1
Вам нужно установить RestoreDirectory
на true
, а также InitialDirectory
.
Мне нужен SaveFileDialog со следующим поведением:
В первый раз, когда вы его открываете, он переходит в "Мои документы".
Затем он переходит к последней выбранной папке. Какой лучший способ достичь этого?
Если я не устанавливаю InitialDirectory, он переходит в каталог exe - чего я не хочу. Он запоминает последний выбранный каталог, хотя - даже между исполнением.
Если я устанавливаю InitialDirectory, он не запоминает последний выбранный каталог. Конечно, я мог бы сохранить последний выбранный каталог в реестре:( но я ищу лучшее решение.
SaveFileDialog dialog = new SaveFileDialog();
//??? dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
dialog.ShowDialog();
Любые советы?
Вам нужно установить RestoreDirectory
на true
, а также InitialDirectory
.
Я понятия не имею, почему это работает, но я, наконец, смог заставить его работать для меня.
Я обнаружил, что если бы я дал полный путь, это не сработало бы, но если бы я ввел этот полный путь внутри 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;
Обязательно проверьте, существует ли путь к каталогу перед установкой свойства Начальная директория. Создайте каталог, если он не существует. то есть
if (!Directory.Exists(FooDirectory))
{
Directory.CreateDirectory(FooDirectory);
}
Я тоже пробовал разные "решения", найденные в разных местах, но никто из них, похоже, не работает, как только в реестре есть запись в списке MRU:/Но вот мое собственное проворное обходное решение...
Вместо установки свойства диалога InitialDirectory
установите для свойства FileName
свой путь, но в сочетании с выбранным Filter
, например:
dialog.FileName = Path.Combine(myPath, "*.*");
Ни один из предоставленных решений не работал у меня печально.
В дополнение к спецификациям OP я хотел, чтобы программа запоминала последнее место сохранения между прогонами. Для этого в Visual Studio Solutions Explorer под ProjectName -> Properties -> Settings.settings
, я устанавливаю следующее свойство:
Поскольку я поддерживаю 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...
}
Это дает поведение:
Рекомендуемые обходные пути для меня не сработали, поэтому после нахождения Как 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, если ранее это диалоговое окно не использовалось для этого расширения файла. После того, как диалог был использован, он возвращается к поведению по умолчанию, помня о предыдущем каталоге.
Я обнаружил, что настройка InitialDirectory
на null
сначала работает с историей пользователя.
OpenFileDialog dlgOpen = new OpenFileDialog();
dlgOpen.InitialDirectory = null;
dlgOpen.InitialDirectory = @"c:\user\MyPath";
Я провел некоторое тестирование с .NET 2.0, и кажется, что если я устанавливаю FileName на что-либо другое, кроме строковой строки, это не сработает. Когда я использую метод или accesstor для установки свойства, исходный каталог игнорируется.
Если вы используете косую черту в любом месте вашего пути, InitialDirectory не работает. Убедитесь, что они конвертированы в обратные косые черты
savefiledialog.InitialDirectory = Application.StartupPath;
savefiledialog.RestoreDirectory = true;
протестирован второй раз.
Это то, с чем я закончил, что согласуется с тем, где 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();
}
}
Просто хотел втянуться в эту дискуссию (пару лет слишком поздно), так как у меня была и точная проблема. Несмотря на то, что можно предположить, что это поведение - то есть использование пути по умолчанию в первый раз, а затем и предыдущий выбранный путь после этого - может быть достигнуто с помощью свойств и функций 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;
}
Это дает мне желаемое поведение, хотя я бы любил более элегантное решение.
'Что касается сохранения выходного файла в нужный каталог в 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)