Establecer la ubicación de inicio del cuadro de diálogo del navegador de carpetas


113

¿Hay alguna forma de establecer el directorio inicial de un cuadro de diálogo del navegador de carpetas en una carpeta no especial? Esto es lo que estoy usando actualmente

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
pero quiero usar una ruta que he almacenado en una cadena algo como esto
fdbLocation.RootFolder = myFolder;
Esto provoca un error "No se puede convertir 'cadena' a 'System.Environment.SpecialFolder'".

Respuestas:


188

Simplemente configure la propiedad SelectedPath antes de llamar a ShowDialog.

fdbLocation.SelectedPath = myFolder;

20
Tenga en cuenta que se requiere para conjunto RootFolderde Environment.SpecialFolder.Desktopo esto puede no funcionar.
Mike Lowery

3
Vea la respuesta de Chad Grants a continuación: Él explica correctamente que RootFolder debe estar configurado, y SelectedPath debe estar debajo de ese RootFolder para que funcione.
Dr Snooze

3
Esto funciona para mí, pero no establece el foco en la carpeta. Tengo que desplazarme manualmente hacia abajo y encontrar la carpeta en la que estaba predeterminado. ¿Hay alguna manera de que establezca el enfoque automáticamente cuando se muestra?
JoBaxter

2
Sin embargo, esto no es lo mismo que configurar RootFolder. Si RootFolderestá configurado, solo la carpeta especificada y las subcarpetas que estén debajo aparecerán en el cuadro de diálogo. SelectedPathsimplemente preselecciona la ruta dada.
Jan Gassen

30

Establezca la propiedad SelectedPath antes de llamar a ShowDialog ...

folderBrowserDialog1.SelectedPath = @"c:\temp\";
folderBrowserDialog1.ShowDialog();

Los iniciará en C: \ Temp


¿Es necesario configurar RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder)? Comportamiento tal cual: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)devuelve C: \ Users \ Myusername \ Desktop. El uso de código de suplantación (con LogonType LOGON32_LOGON_INTERACTIVE) devuelve una cadena vacía
Kiquenet

24
fldrDialog.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)

"Si la propiedad SelectedPath se establece antes de mostrar el cuadro de diálogo, la carpeta con esta ruta será la carpeta seleccionada, siempre que SelectedPath se establezca en una ruta absoluta que sea una subcarpeta de RootFolder (o más exactamente, apunte a una subcarpeta de el espacio de nombres de shell representado por RootFolder) ".

MSDN - Ruta seleccionada

"El método GetFolderPath devuelve las ubicaciones asociadas con esta enumeración. Las ubicaciones de estas carpetas pueden tener diferentes valores en diferentes sistemas operativos, el usuario puede cambiar algunas de las ubicaciones y las ubicaciones están localizadas".

Re: Escritorio vs DesktopDirectory

Escritorio

"El escritorio lógico en lugar de la ubicación del sistema de archivos físico".

DesktopDirectory:

"El directorio que se utiliza para almacenar físicamente los objetos de archivo en el escritorio. No confunda este directorio con la carpeta del escritorio, que es una carpeta virtual".

MSDN: enumeración de carpetas especiales

MSDN - GetFolderPath


Para rutas especiales, puede hacer {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
tymtam

Perfecto. Gracias. La clave es que SelectedPath debe estar debajo de RootFolder si el cuadro de diálogo debe apuntar a SelectedPath cuando se abre.
Dr Snooze

Comportamiento tal cual: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)devuelve C: \ Users \ Myusername \ Desktop. El uso de código de suplantación (con LogonType LOGON32_LOGON_INTERACTIVE) devuelve una cadena vacía
Kiquenet

9

Para establecer la ruta seleccionada del directorio y recuperar el nuevo directorio:

dlgBrowseForLogDirectory.SelectedPath = m_LogDirectory;
if (dlgBrowseForLogDirectory.ShowDialog() == DialogResult.OK)
{
     txtLogDirectory.Text = dlgBrowseForLogDirectory.SelectedPath;
}

2

Encontrado en dotnet-snippets.de

¡Con la reflexión esto funciona y establece el RootFolder real!

using System;
using System.Reflection;
using System.Windows.Forms;

namespace YourNamespace
{
    public class RootFolderBrowserDialog
    {

        #region Public Properties

        /// <summary>
        ///   The description of the dialog.
        /// </summary>
        public string Description { get; set; } = "Chose folder...";

        /// <summary>
        ///   The ROOT path!
        /// </summary>
        public string RootPath { get; set; } = "";

        /// <summary>
        ///   The SelectedPath. Here is no initialization possible.
        /// </summary>
        public string SelectedPath { get; private set; } = "";

        #endregion Public Properties

        #region Public Methods

        /// <summary>
        ///   Shows the dialog...
        /// </summary>
        /// <returns>OK, if the user selected a folder or Cancel, if no folder is selected.</returns>
        public DialogResult ShowDialog()
        {
            var shellType = Type.GetTypeFromProgID("Shell.Application");
            var shell = Activator.CreateInstance(shellType);
            var folder = shellType.InvokeMember(
                             "BrowseForFolder", BindingFlags.InvokeMethod, null,
                             shell, new object[] { 0, Description, 0, RootPath, });
            if (folder is null)
            {
                return DialogResult.Cancel;
            }
            else
            {
                var folderSelf = folder.GetType().InvokeMember(
                                     "Self", BindingFlags.GetProperty, null,
                                     folder, null);
                SelectedPath = folderSelf.GetType().InvokeMember(
                                   "Path", BindingFlags.GetProperty, null,
                                   folderSelf, null) as string;
                // maybe ensure that SelectedPath is set
                return DialogResult.OK;
            }
        }

        #endregion Public Methods

    }
}

¿Alguna idea de cómo expandir y contraer el elemento de la carpeta preestablecida?
Goodies

voté a favor y me gusta esta respuesta, pero !! Debe tenerse en cuenta que el usuario no podrá navegar a un nivel superior al establecido en esta carpeta raíz, según msdn: docs.microsoft.com/en-us/windows/win32/shell/… . El trabajo que utilicé es simple, use el .net FolderBrowser predeterminado, configure la carpeta especial en MyComputer y luego configure la ruta seleccionada. esto también expandirá las carpetas hasta el directorio de ruta seleccionado, pero NO se desplazará hasta él.
Heriberto Lugo

0

En mi caso, fue un doble escape accidental.

esto funciona:

SelectedPath = @"C:\Program Files\My Company\My product";

esto no:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.