C#FolderBrowserDialog-如何包括共享文件夹

时间:2018-11-28 00:38:48

标签: c# .net visual-studio vsto folderbrowserdialog

我按如下方式创建FolderFrowserDialog(仅摘录-不完整的代码):

   string tempSetWorkingPath = null;
    try
    {
        FolderBrowserDialog folderDlg = new System.Windows.Forms.FolderBrowserDialog();

        folderDlg.ShowNewFolderButton = true;
        folderDlg.Description = "Selected your working folder. This is where your PDF files will be saved.";
        folderDlg.RootFolder = Environment.SpecialFolder.MyComputer;
        folderDlg.SelectedPath = (Convert.ToString(WorkingPath).Trim().Length == 0) ? ((int)Environment.SpecialFolder.MyComputer).ToString() : WorkingPath;

        if (folderDlg.ShowDialog() == DialogResult.OK)
        {
            tempSetWorkingPath = folderDlg.SelectedPath;
        }
        else
        {
            tempSetWorkingPath = "";
        }
    }

...

该代码运行良好,除了显示的唯一文件夹是本地文件夹。用户在其系统上具有DropBox和OneDrive共享文件夹,并且要选择这些目录之一,用户需要循环浏览Windows用户目录并从中选择文件夹。在过去几个月中看到的某些系统上,我已经看到DropBox和OneDrive目录出现在DeskTop目录下面...但是,尽管经过了数小时的搜索,我仍然没有找到找到实现该目标的方法。

我该如何实现?

MTIA

DWE

1 个答案:

答案 0 :(得分:0)

鉴于我已经观察到在这里和其他地方发布的关于包含目录(包括共享目录)的大量查询,并给出@ Mailosz的响应,因此文件夹对话框的root folder property似乎拥有关键- it获取或设置浏览开始的根文件夹,这就是我的代码丢失的原因。

我的问题中提及的功能的完整代码显示在下面,以帮助其他人。

/// <summary>
/// presents the user with a folder dialog
/// Returns a full qualified directory chosen by the user
/// </summary>
/// <param name="WorkingPath">if a fully qualified directory name is provided, then the folder structure in the folder dialog will open to the directory selected</param>
/// <returns>Returns a full qualified directory chosen by the user or if no directory was chosen, an empty string</returns>
public string SetWorkingPath(string WorkingPath)
{
    string tempSetWorkingPath = null;
    try
    {
        FolderBrowserDialog folderDlg = new System.Windows.Forms.FolderBrowserDialog();
        // check our proposed working path and if its valid
        if((!string.IsNullOrEmpty(WorkingPath) && (WorkingPath != null)))
        {
            if (!Directory.Exists(WorkingPath))
                  WorkingPath = string.Empty;
        }
        else // if we are empty or null set us to empty
        {
            WorkingPath = string.Empty;
        }
        folderDlg.ShowNewFolderButton = true;
        folderDlg.Description = "Please select your working folder. This is where your PDF files will be saved.";
        folderDlg.RootFolder = Environment.SpecialFolder.Desktop;//.MyComputer;
        folderDlg.SelectedPath = (Convert.ToString(WorkingPath).Trim().Length == 0) ? ((int)Environment.SpecialFolder.MyComputer).ToString() : WorkingPath;

        if (folderDlg.ShowDialog() == DialogResult.OK)
        {
            // make sure we have a backslash on the end of our directory string
            tempSetWorkingPath = PathAddBackslash(folderDlg.SelectedPath);
        }
        else
        {
            // return an empty string
            tempSetWorkingPath = string.Empty;
        }
    }
    catch (Exception ex)
    {
        tempSetWorkingPath = string.Empty;

        throw (ex);
    }

    return tempSetWorkingPath;
}
public string PathAddBackslash(string path)
{
    // They're always one character but EndsWith is shorter than
    // array style access to last path character. Change this
    // if performance are a (measured) issue.
    string separator1 = Path.DirectorySeparatorChar.ToString();
    string separator2 = Path.AltDirectorySeparatorChar.ToString();

    // Trailing white spaces are always ignored but folders may have
    // leading spaces. It's unusual but it may happen. If it's an issue
    // then just replace TrimEnd() with Trim(). Tnx Paul Groke to point this out.
    path = path.TrimEnd();

    // Argument is always a directory name then if there is one
    // of allowed separators then I have nothing to do.
    if (path.EndsWith(separator1) || path.EndsWith(separator2))
        return path;

    // If there is the "alt" separator then I add a trailing one.
    // Note that URI format (file://drive:\path\filename.ext) is
    // not supported in most .NET I/O functions then we don't support it
    // here too. If you have to then simply revert this check:
    // if (path.Contains(separator1))
    //     return path + separator1;
    //
    // return path + separator2;
    if (path.Contains(separator2))
        return path + separator2;

    // If there is not an "alt" separator I add a "normal" one.
    // It means path may be with normal one or it has not any separator
    // (for example if it's just a directory name). In this case I
    // default to normal as users expect.
    return path + separator1;
}