Definir local de início da caixa de diálogo do navegador da pasta


113

Existe alguma maneira de definir o diretório inicial de uma caixa de diálogo do navegador de pasta para uma pasta não especial? Isso é o que estou usando atualmente

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
mas quero usar um caminho que armazenei em uma string parecida com esta
fdbLocation.RootFolder = myFolder;
Isso causa um erro "Não é possível converter 'string' em 'System.Environment.SpecialFolder'".

Respostas:


188

Basta definir a propriedade SelectedPath antes de chamar ShowDialog.

fdbLocation.SelectedPath = myFolder;

20
Observe que é necessário definir RootFoldercomo Environment.SpecialFolder.Desktopou isso pode não funcionar.
Mike Lowery

3
Veja a resposta de Chad Grants abaixo: Ele explica corretamente que o RootFolder deve ser definido, e o SelectedPath deve estar abaixo desse RootFolder para funcionar.
Dr. Snooze de

3
Isso funciona para mim, mas não define o foco para a pasta. Tenho que rolar manualmente para baixo e encontrar a pasta padrão. Existe uma maneira de definir o foco automaticamente quando mostrado?
JoBaxter

2
No entanto, isso não é o mesmo que configuração RootFolder. Se RootFolderestiver definido, apenas a pasta especificada e quaisquer subpastas que estejam abaixo dela aparecerão na caixa de diálogo. SelectedPathsimplesmente pré-seleciona o caminho fornecido.
Jan Gassen

30

Defina a propriedade SelectedPath antes de chamar ShowDialog ...

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

Irá iniciá-los em C: \ Temp


É necessário definir RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder)? Comportamento como está: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)retorna C: \ Users \ Myusername \ Desktop. Usando o código de personificação (com LogonType LOGON32_LOGON_INTERACTIVE) retorna uma string vazia
Kiquenet

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

"Se a propriedade SelectedPath for definida antes de mostrar a caixa de diálogo, a pasta com este caminho será a pasta selecionada, desde que SelectedPath seja definido como um caminho absoluto que é uma subpasta de RootFolder (ou mais precisamente, aponta para uma subpasta de o namespace do shell representado por RootFolder). "

MSDN - SelectedPath

"O método GetFolderPath retorna os locais associados a esta enumeração. Os locais dessas pastas podem ter valores diferentes em sistemas operacionais diferentes, o usuário pode alterar alguns dos locais e os locais são localizados."

Re: Desktop vs DesktopDirectory

Área de Trabalho

"A área de trabalho lógica em vez da localização física do sistema de arquivos."

DesktopDirectory:

"O diretório usado para armazenar fisicamente objetos de arquivo na área de trabalho. Não confunda esse diretório com a própria pasta da área de trabalho, que é uma pasta virtual."

MSDN - Enum de pasta especial

MSDN - GetFolderPath


Para caminhos especiais, você pode fazer {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
tymtam

Perfeito. Obrigado. A chave é que o SelectedPath deve estar abaixo do RootFolder se a caixa de diálogo estiver apontando para o SelectedPath quando for aberto.
Dr. Snooze

Comportamento como está: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)retorna C: \ Users \ Myusername \ Desktop. Usando o código de personificação (com LogonType LOGON32_LOGON_INTERACTIVE) retorna uma string vazia
Kiquenet

9

Para definir o caminho do diretório selecionado e recuperar o novo diretório:

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

2

Encontrado em dotnet-snippets.de

Com reflexão, isso funciona e define o verdadeiro RootFolder!

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

    }
}

Alguma ideia de como expandir e recolher o item da pasta predefinida?
Goodies

Eu votei positivamente e gosto dessa resposta, mas !! deve-se observar que o usuário não será capaz de navegar mais alto do que o que esta pasta raiz está definida, de acordo com msdn : docs.microsoft.com/en-us/windows/win32/shell/… . A solução que usei é simples, use o padrão .net FolderBrowser, defina a pasta especial como MyComputer e defina o caminho selecionado. isso também expandirá as pastas até o diretório de caminho selecionado, mas NÃO rolará até ele.
Heriberto Lugo

0

No meu caso, foi um escape duplo acidental.

isso funciona:

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

isso não:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.