# FileSelectFile

显示一个允许用户来打开或保存文件的标准对话框。

FileSelectFile,OutputVar[,Options,RootDir\Filename,Prompt,Filter]

#### 参数

OutputVar | 用来保存用户选择的文件名的变量名称。如果用户取消了对话框(即不想选择一个文件)，该变量为空。
Options | 如果省略此项，默认值为 0，意味着以下选项都不生效。 M: 多选。指定字母 M 表示允许用户通过按住 Shift、Control 键或者其它方式来选择多个文件。M 后面可以跟一个下面提到的数字(例如，M 和 M1 都是有效的)。要提取单个文件，请看本页底部的例子。 S: 保存按钮。指定字母 S 使对话框上总是包含保存按钮而不是打开按钮。S 后面可以跟一个下面提到的数字(或几个数的和。例如，S 和 S24 都是有效的)。 即使没有 M 和 S，下列数字也可以被使用。要同时使多个选项生效，只要把数字加起来。例如，要使用 8 和 16，指定数字 24。 1：文件必须存在 2：路径必须存在 8：提示创建新文件 16：提示覆盖文件 32 [v1.0.43.09+]：选择的快捷方式(.lnk 文件)是它本身而不是它所指向的目标。此选项也防止了选择一个文件夹快捷方式会跳转到那个文件夹。 如果用“提示覆盖文件”选项并且不用“提示创建新文件”选项的话，对话框将包含保存按钮而不是打开按钮。这个问题是 Windows 的毛病。
RootDir\Filename | 如果存在，此参数可包含下列的一项或全部： RootDir：根(起始)目录，如果没有使用完全路径的话，假设为 %A_WorkingDir% 里的子文件夹。如果省略此参数或留空，起始目录会是默认值，而且随操作系统版本而有所不同(在 WinNT/2k/XP 及之后的版本中，它通常是用户上一次使用 FileSelectFile 时选择的目录)。在 v1.0.43.10 及之后的版本中，支持使用 CLSID(Windows 类标识符)比如 ::{20d04fe0-3aea-1069-a2d8-08002b30309d}(即我的电脑)，这时在 CLSID 后面的任何子目录路径都必须以反斜线结尾(否则，最后一个反斜杠之后的字符串将被认为是默认的文件名，请看下面)。 Filename：一开始显示在对话框里的编辑框中的默认文件名。只有单独的文件名(不带路径)才会被显示。要确保对话框正确地显示，请不要提交非法的字符(比如 /<|:")。 示例：
    C:\My Pictures\Default Image Name.gif ; RootDir 和 Filename 都提供了。
    C:\My Pictures ;只提供了 RootDir。
    My Pictures ;只提供了 RootDir，它相对于当前的工作目录。
    My File ;只提供了 Filename(但如果存在“My File”文件夹，则会被认为是 RootDir)。
Prompt | 显示在窗口标题栏指示用户做什么的文本。如果省略或留空，它将默认为"Select File - %A_SCRIPTNAME%" (即当前脚本的名称)。
Filter | 指示哪些类型的文件会被对话框显示。 例如：Documents (*.txt) 例如：Audio (*.wav; *.mp2; *.mp3) 如果省略，过滤器默认是 All Files (*.*)。另外在对话框的“文件类型”下拉列表中的 Text Documents (*.txt) 选项也是可用的。 否则，过滤器将使用此参数指示的字符串，不过在对话框的“文件类型”下拉列表中仍然提供 All Files (*.*) 的选项。要在过滤器中包含多个文件扩展名，像上面的例子中那样用分号将它们隔开。

#### ErrorLevel

如果用户没有选择文件(比如按了取消按钮)就关掉了对话框，ErrorLevel 设为 1。如果系统拒绝显示对话框时(罕见)也将设为 1。之外设为 0。

#### 注意

如果用户什么也没选(例如按了取消)，OutputVar 为空。

如果没有使用多选，OutputVar 的值将设为用户选择的单个文件的完整路径和名称。

如果使用了 M 选项(多选)，OutputVar 的值将设为一个列表，其中除了最后一个外，每个后面都跟了一个换行符(`n)。列表中的第一行是所有被选择的文件的路径(只有在此路径是根目录比如 C:\ 时才以反斜线结尾)。其它的条目是被选择的文件名(不带路径)。例如：
C:\My Documents\New Folder [这是下面所有文件所在的路径]
test1.txt [这些是单独的文件名：没有路径]
test2.txt
……等。
(本页底部的例子示范了如何一个个提取文件。)

在使用多选时，被选择的文件名的总长度被限制在 64 KB。不过通常这足以容纳几千个文件了，如果超出此限制的话，OutputVar 将为空。

GUI 窗口可以用 Gui +OwnDialogs 来显示一个 modal(模态)文件选择对话框。模态对话框可以阻止用户在关掉对话框之前与 GUI 窗口的交互。

已知限制：在文件选择对话框显示期间运行的定时器会延迟用户在对话框中点击的效果直到定时器结束。要绕弯解决此限制，应避免使用那些子程序会运行很长时间才结束的定时器，或者在使用对话框时禁用所有的定时器：

    Thread，NoTimers
    FileSelectFile，OutputVar
    Thread，NoTimers，false

作废的选项：在 v1.0.25.06 及之后的版本中，多选选项“4”已作废。可是为了与以前的脚本兼容，这个选项仍然可用。具体是，如果用户只选择了一个文件，OutputVar 会包括它的完整路径和文件名再加上一个换行符(`n)。如果用户选择了多个文件，除了最后一行还是以换行符(`n)结尾外，其它的格式都和上面描述的 M 选项一样。

#### 相关命令

FileSelectFolder, MsgBox, InputBox, ToolTip, GUI, CLSID List, parsing loop, SplitPath

操作系统也提供了标准的对话框来提示用户选择字体、颜色或图标。这些对话框可以通过 DllCall() 命令来显示，请看 www.autohotkey.com/forum/topic17230.html。

#### 示例

    FileSelectFile, SelectedFile, 3, , 打开一个文件 (*.txt; *.doc)
    if SelectedFile =
        MsgBox, 用户什么也没有选择。
    else
        MsgBox, 用户选了下列文件:`n%SelectedFile%

    CLSID 示例:
    FileSelectFile, OutputVar,, ::{645ff040-5081-101b-9f08-00aa002f954e}  ;回收站。

    ;多选示例:
    FileSelectFile, files, M3  ; M3 = 选择多个存在的文件。
    if files =
    {
        MsgBox, 用户按了取消。
        return
    }
    Loop, parse, files, `n
    {
        if a_index = 1
            MsgBox, 选择的文件都包含在 %A_LoopField%。
        else
        {
            MsgBox, 4, , 下一个文件是 %A_LoopField%。继续？
            IfMsgBox, No, break
        }
    }
    return

翻译：单菜子 修正：天堂之门 menk33@163.com 2008年11月8日