Klasör tarayıcısı iletişim kutusu başlangıç ​​konumunu ayarla


113

Bir klasör tarayıcısı iletişim kutusunun ilk dizinini özel olmayan bir klasöre ayarlamanın herhangi bir yolu var mı? Şu anda kullandığım şey bu

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
ama bir dizede sakladığım yolu kullanmak istiyorum, bunun gibi bir şey
fdbLocation.RootFolder = myFolder;
Bu, "'string' 'System.Environment.SpecialFolder'a dönüştürülemiyor" hatasına neden olur.

Yanıtlar:


188

ShowDialog'u çağırmadan önce SelectedPath özelliğini ayarlamanız yeterlidir.

fdbLocation.SelectedPath = myFolder;

20
Ayarlanması RootFoldergerektiğini Environment.SpecialFolder.Desktopveya bunun işe yaramayabileceğini unutmayın.
— Mike Lowery

3
Aşağıdaki Chad Grants cevabına bakın: Haklı olarak, RootFolder'ın ayarlanması gerektiğini ve SelectedPath'in çalışmak için bu RootFolder'ın altında olması gerektiğini açıklıyor.
— Dr Snooze

3
Bu benim için çalışıyor, ancak odağı klasöre ayarlamıyor. Manuel olarak aşağı kaydırmalı ve varsayılan olduğu klasörü bulmalıyım. Odağı gösterildiğinde otomatik olarak ayarlamasının bir yolu var mı?
— JoBaxter

2
Ancak bu , ayar ile aynı değildirRootFolder . Eğer RootFolderayarlanır, yalnızca belirtilen klasör ve iletişim kutusunda belirecektir altında hiçbir alt klasörleri. SelectedPathyalnızca verilen yolu önceden seçer.
— Jan Gassen

30

ShowDialog'u aramadan önce SelectedPath özelliğini ayarlayın ...

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

Onları C: \ Temp'de başlatacak


RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder) ayarlanması gerekir mi? Olduğu gibi davranış: C: \ Kullanıcılar \ Kullanıcıadım \ MasaüstüEnvironment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) döndürür . Kimliğe bürünme kodunu kullanmak (LogonType LOGON32_LOGON_INTERACTIVE ile) boş dize
— Kiquenet

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

"SelectedPath özelliği, iletişim kutusu gösterilmeden önce ayarlanmışsa, SelectedPath, RootFolder'ın bir alt klasörü olan (veya daha doğrusu, RootFolder tarafından temsil edilen kabuk ad alanı). "

MSDN - SelectedPath

"GetFolderPath yöntemi bu numaralandırma ile ilişkili konumları döndürür. Bu klasörlerin konumları farklı işletim sistemlerinde farklı değerlere sahip olabilir, kullanıcı bazı konumları değiştirebilir ve konumlar yerelleştirilir."

Re: Desktop vs DesktopDirectory

Masaüstü

"Fiziksel dosya sistemi konumu yerine mantıksal Masaüstü."

desktopDirectory:

"Masaüstünde dosya nesnelerini fiziksel olarak depolamak için kullanılan dizin. Bu dizini, sanal bir klasör olan masaüstü klasörünün kendisiyle karıştırmayın."

MSDN - Özel Klasör Sıralaması

MSDN - GetFolderPath


Özel yollar için şunu yapabilirsiniz: {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
— tymtam

Mükemmel. Teşekkür ederim. Önemli olan, iletişim kutusu açıldığında SelectedPath'i işaret ediyorsa SelectedPath'in RootFolder'ın altında olması gerektiğidir.
— Dr Snooze

Olduğu gibi davranış: C: \ Kullanıcılar \ Kullanıcıadım \ MasaüstüEnvironment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) döndürür . Kimliğe bürünme kodunu kullanmak (LogonType LOGON32_LOGON_INTERACTIVE ile) boş dize
— Kiquenet

9

Seçilen dizini yolu ayarlamak ve yeni dizini geri almak için:

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

2

Dotnet-snippets.de adresinde bulundu

Yansıma ile bu çalışır ve gerçek RootFolder'ı belirler!

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

    }
}

Ön ayarlı klasör öğesini nasıl genişletip daraltacağınıza dair bir fikriniz var mı?
— Goodies

oy verdim ve bu cevabı beğendim, ama !! msdn: docs.microsoft.com/en-us/windows/win32/shell/… uyarınca, kullanıcının bu kök klasörün ayarlandığından daha yükseğe göz atamayacağına dikkat edilmelidir . Kullandığım geçici çalışma basittir, varsayılan .net FolderBrowser'ı kullanın, özel klasörü Bilgisayarım olarak ayarlayın ve ardından seçilen yolu ayarlayın. bu aynı zamanda klasörleri seçilen yol dizinine kadar genişletir, ancak ona KAYMAYACAKTIR.
— Heriberto Lugo

0

Benim durumumda, kazara çift kaçış oldu.

bu çalışıyor:

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

bu değil:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.