# FileSelectFolder

显示可以让用户选择文件夹的标准对话框.

    FileSelectFolder, OutputVar , StartingFolder, Options, Prompt

## 参数

OutputVar

  用来保存用户选择的文件夹的变量名. 如果用户取消了对话框(即不想选择文件夹), 则此变量被置空. 如果用户选择了根目录(例如 C:\), 则 OutputVar 会包含末尾的反斜杠. 如果不希望这样, 则使用如下方法移除它:

      FileSelectFolder, Folder
      Folder := RegExReplace(Folder, "\\$")  ; 移除默认的反斜杠, 如果存在.

StartingFolder

  如果为空或省略, 则对话框的初始选择对象为用户的我的文档文件夹(或可能是我的电脑). 可以指定 CLSID 文件夹例如 `::{20d04fe0-3aea-1069-a2d8-08002b30309d}`(即我的电脑) 来从特定的专用文件夹开始导航.

  否则, 此参数最常见的用法是星号后面紧跟着初始选择的驱动器或文件夹的绝对路径. 例如, `*C:\` 会初始选择 C 驱动器. 同样地, `*C:\My Folder` 会初始选择这个特殊的文件夹.

  星号表示允许用户从起始文件夹向上导航(接近根目录). 如果没有星号, 则强制用户在 StartingFolder 中选择文件夹(或 StartingFolder 自身). 省略星号的一个好处是最初 StartingFolder 会显示为树形展开状态, 这样可以节省用户点击前面加号的时间.

  如果使用星号, 则向上导航可以被限制到桌面外的其他文件夹. 在星号前加上最上级文件夹的绝对路径跟着一个空格或 tab 即可实现. 例如, `C:\My Folder *C:\My Folder\Projects` 将不允许用户导航到比 C:\My Folder 更上级的文件夹(不过初始选择对象为 C:\My Folder\Projects):

Options

  下列数字的其中一个:

  0: 禁用下面所有选项(不包括 Windows 2000, 这里可能总是会显示 "新建文件夹" 按钮).

  1(默认): 提供允许用户新建文件夹的按钮.

  增加 2 到上面的数字来提供允许用户输入文件夹名称的编辑区域. 例如, 此参数使用数值 3 表示同时提供编辑区域和 "新建文件夹" 按钮.

  增加 4 到上面的数字来忽略 BIF_NEWDIALOGSTYLE 属性. 增加 4 确保了 FileSelectFolder 即使在像 WinPE 或 BartPE 这样的预安装环境中也能正常工作. 然而, 这样阻止了 "新建文件夹" 按钮的出现, 至少在 Windows XP 上是这样. ["4" 需要 v1.0.48+]

  如果用户在编辑区域中输入了无效的文件夹名称, 则 OutputVar 会被设置为在导航树中选择的文件夹而不是用户输入的内容, 至少在 Windows XP 上是这样.

  此参数可以为表达式.

Prompt

  显示在窗口中用来提示用户操作的文本. 如果省略或为空, 则它默认为 "Select Folder - %A_ScriptName%"(即当前脚本的名称).

## 错误处理

[v1.1.04+]: 此命令失败时会抛出异常. 想了解更多信息, 请参阅运行时错误.

如果用户没有选择文件却解除了对话框(例如按下了取消按钮), 则 ErrorLevel 被置为 1. 如果系统拒绝显示对话框(罕见), 那么它也被设置为 1. 否则被置为 0.

## 备注

文件夹选择对话框通常如下所示:

GUI 窗口可以使用 Gui +OwnDialogs 的方法显示文件夹选择模式对话框. 模式对话框在其消失之前会阻止用户与 GUI 窗口进行交互.

已知限制: 在显示 FileSelectFolder 对话框时运行的计时器会延迟用户在对话框中点击的效果到计时器结束之后. 要变通解决此问题, 请避免使用子程序需要很长时间来完成的计时器, 或在显示对话框期间禁用所有计时器:

    Thread, NoTimers
    FileSelectFolder, OutputVar,, 3
    Thread, NoTimers, false

## 相关

FileSelectFile, MsgBox, InputBox, ToolTip, GUI, CLSID List, FileCopyDir, FileMoveDir, SplitPath

此外, 操作系统提供了标准的对话框让用户选取字体, 颜色或图标. 使用 DllCall() 可以显示这些对话框, 演示的例子请参阅 GitHub.

## 示例

允许用户选择一个文件夹, 并提供一个编辑字段和 "新建文件夹" 按钮.

    FileSelectFolder, OutputVar, , 3
    if OutputVar =
        MsgBox, You didn't select a folder.
    else
        MsgBox, You selected folder "%OutputVar%".

CLSID 例子. 允许用户选择 "我的电脑" 目录下的文件夹.

    FileSelectFolder, OutputVar, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}  ; 我的电脑.

dftg