【问题标题】:How do I keep track of the last folder selected by a user?如何跟踪用户选择的最后一个文件夹?
【发布时间】:2012-08-20 14:18:09
【问题描述】:

我认为使用应用程序设置可以解决问题,但我没有让它工作。这就是我所拥有的:

private void btnBrowse_Click(object sender, EventArgs e)
        {
            if (fbFolderBrowser.ShowDialog() == DialogResult.OK)
            {
                // I want to open the last folder selected by the user here.
            }

当用户单击此按钮时,我想打开浏览窗口到他访问的最后一个文件夹并保存它。下次他点击按钮时,它会自动选择那个文件夹。

我在想也许我可以使用可以在运行时更改的用户变量,但我没有让它工作。谁能帮帮我?

【问题讨论】:

  • 另外,如果您使用的是应用程序设置,请不要忘记保存更改:Settings.Default.Save();

标签: c# directory


【解决方案1】:

转到设置页面,您创建的项目的项目设计器,并在应用程序中添加文件夹路径变量。现在添加以下代码以恢复上次选择的文件夹路径。

FolderBrowserDialog folderBrowser = new FolderBrowserDialog();
folderBrowser.Description = "Select a folder to extract to:";
folderBrowser.ShowNewFolderButton = true;
folderBrowser.SelectedPath = Properties.Settings.Default.Folder_Path;
//folderBrowser.SelectedPath = project_name.Properties.Settings.Default.Folder_Path;

if (folderBrowser.ShowDialog() == DialogResult.OK)
{

    if (!String.IsNullOrEmpty(Properties.Settings.Default.Folder_Path))
        Properties.Settings.Default.Folder_Path = folderBrowser.SelectedPath;

    Properties.Settings.Default.Folder_Path = folderBrowser.SelectedPath;
    Properties.Settings.Default.Save();
}

【讨论】:

【解决方案2】:

有两个地方可以找到用户最后访问的文件夹:

  1. Recent Files and Folders:可以在这里找到:C:\Documents and Settings\USER\Recent
  2. Registry:在注册表里看这里:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSaveMRU

你可以用这个sn-p找到它:

public static string GetLastOpenSaveFile(string extention)
{
    RegistryKey regKey = Registry.CurrentUser;
    string lastUsedFolder = string.Empty;
    regKey = regKey.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU");

    if (string.IsNullOrEmpty(extention))
        extention = "html";

    RegistryKey myKey = regKey.OpenSubKey(extention);

    if (myKey == null && regKey.GetSubKeyNames().Length > 0)
        myKey = regKey.OpenSubKey(regKey.GetSubKeyNames()[regKey.GetSubKeyNames().Length - 2]);

    if (myKey != null)
    {
        string[] names = myKey.GetValueNames();
        if (names != null && names.Length > 0)
        {
            lastUsedFolder = (string)myKey.GetValue(names[names.Length - 2]);
        }
    }

    return lastUsedFolder;
}

在 Windows XP 中,当您在 SaveFileDialog 上按 Save 时,保存文件的目录被设置为新的当前工作目录(Environment.CurrentDirectory 中的那个)。

这样,当你重新打开FileDialog时,它会和之前在同一个目录下打开。

通过设置FileDialog.RestoreDirectory = true,当你关闭FileDialog时,会恢复原来的工作目录。

在 Windows Vista/Seven 中,行为始终为 FileDialog.RestoreDirectory = true

【讨论】:

  • 天啊!我在想一些更简单的事情,例如使用项目属性变量跟踪最后一个文件夹。大声笑。
  • 这也取决于您正在使用的操作系统。它在不同操作系统中的工作方式不同。
  • 这适用于使用 Windows 7 的机器。虽然这可能会有所不同:S
  • RegistryKeys 是 IDisposable,请务必将它们包装在 using 块中,或者在完成后对它们调用 .Dispose()
【解决方案3】:

应用程序设置可以解决问题。
A more elaborated version is here

使用字符串类型的设置

为每个按钮创建一个设置并将路径存储在那里。然后使用 设置为ofd.InitialPath

使用上面的代码示例,试试这个:

在解决方案资源管理器中右键单击您的应用名称,单击设置 选项卡名称 = Button1Path 类型 = 字符串范围 = 用户

然后使用这个:

private void btnBrowse_Click(object sender, EventArgs e)
{
    fbFolderBrowser.InitialDirectory=this.Settings.Button1Path;
    if (fbFolderBrowser.ShowDialog() == DialogResult.OK)
    {
        // I want to open the last folder selected by the user here.
        this.Settings.Button1Path=fbFolderBrowser.SelectedPath
    }
}

【讨论】:

    【解决方案4】:

    您可以轻松跟踪上次选择的文件夹,如下所示:

    public String LastSelectedFolder;
    
    private void btnBrowse_Click(object sender, EventArgs e)
    {
        fbFolderBrowser.InitialDirectory=this.Settings.Button1Path;
        if (fbFolderBrowser.ShowDialog() == DialogResult.OK)
        {
            // Save Last selected folder.
            LastSelectedFolder = fbFolderBrowser.SelectedPath;
        }
    }
    

    【讨论】:

      【解决方案5】:

      我知道这是一个非常古老的线程,但没有一个答案指向在用户最后一个位置重新打开文件浏览器的最简单方法。

      只需定义 RestoreDirectory = true。 检查示例

      var fd = new OpenFileDialog
         {
             Filter = @"All Files|*.*",
             RestoreDirectory = true,
             CheckFileExists = true
         };
      

      类 OpenFileDialog api 参考

      https://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.restoredirectory(v=vs.110).aspx

      除非我误解了帖子的意图,否则这是迄今为止最简单的实现方式。但是,如果您确实需要打印最后一个位置,请检查另一个

      【讨论】:

      • 简洁明了:)
      • 这个问题是关于FolderBrowserDialog,而不是关于OpenFileDialog
      • @GeertBellekens,问题没有指定要使用的特定类。这里的问题是:“我想打开浏览窗口到他访问的最后一个文件夹并保存它。下次他点击按钮时,它会自动选择那个文件夹。”所以我不明白反对票。你能澄清一下吗?此外,使用 FolderBrowserDialog 或 OpenFileDialog 的解决方案完全相同。两者具有相同的属性,其目的是在以前使用的相同位置打开对话框。而不是仅仅投反对票,应该给出一个实际的答案......
      • RestoreDirectory 处于 FileDialog 级别,不在 FolderBrowserDialog 中。
      猜你喜欢
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      相关资源
      最近更新 更多