FileSelectFile

显示可以让用户打开或保存文件的标准对话框。

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

参数

OutputVar

用来保存用户选择的文件名的变量名称. 如果用户取消了对话框 (即不想选择文件), 则此变量被置空.

选项

如果省略, 则它默认为零, 相当于下面的任意选项都没有指定.

M: 多选. 指定字母 M 让用户可以使用 shift-click, control-click 或其他方法来选择多个文件. M 后面可以跟着下面描述的数字 (例如, M 和 M1 都是有效的). 要逐个提取文件, 请参阅此页面底部的例子.

S: 保存按钮. 指定字母 S 让对话框显示保存按钮代替打开按钮. S 后面可以跟着下面描述的数字 (或几个数的和) (例如, S 和 S24 都是有效的).

即使同时省略 MS, 仍然可以使用下面的数字. 要让多个数字同时生效, 请把它们加在一起. 例如, 要使用 8 和 16, 请指定数字 24.

1: 文件必须存在
2: 路径必须存在
8: 提示创建新文件
16: 提示覆盖文件
32 [v1.0.43.09+]: 按原样选择快捷方式 (.lnk 文件) 而不把它们解析为它们的目标. 此选项也避免了通过文件夹快捷方式跳转到那个文件夹的情况.

如果使用 "提示覆盖" 选项而没有使用 "提示创建" 选项, 则对话框会包含保存按钮而不是打开按钮. 此行为是因为 Windows 的怪癖.

RootDir\Filename

如果存在, 则此参数包含下列的其中一个或两个:

RootDir: 根 (起始) 目录, 如果未指定绝对路径则假定为 %A_WorkingDir% 中的子文件夹. 如果省略或为空,则起始目录将为默认值,这可能操作系统版本有关(它很可能是之前使用 FileSelectFile 时用户最近选择的目录)。v1.0.43.10+ 在 Windows XP/2003 或早期系统中,还可以指定 CLSID 例如 ::{20d04fe0-3aea-1069-a2d8-08002b30309d}(即我的电脑),此时在 CLSID 后任何子目录都应该以反斜线结尾(否则在最后一个反斜线后的字符串会被解释为默认文件名,这点在下面说明)。

Filename: 初始显示对话框时在编辑区域的默认文件名. 只显示单独的文件名 (不带路径). 要让对话框正确显示, 请确保不包含非法字符 (例如 /<|:").

示例:

C:\My Pictures\Default Image Name.gif  ; 同时使用了 RootDirFilename.
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)

如果省略, 则过滤器默认为 所有文件 (*.*). 在对话框 "文件类型" 菜单中, 文本文档 (*.txt) 选项还是可用的.

否则, 过滤器使用指示的字符串, 不过在对话框的 "文件类型" 下拉列表中仍然提供了 所有文件 (*.*) 选项. 要在过滤器中包含多个文件扩展名, 请使用分号分隔它们, 如上所示.

ErrorLevel

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

如果用户没有选择文件却解除了对话框 (例如按下了取消按钮), 则 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 的方法显示模态的文件选择对话框. 模态对话框在其消失之前会阻止用户与 GUI 窗口进行交互.

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

Thread, NoTimers
FileSelectFile, OutputVar
Thread, NoTimers, false

过时选项: 在 v1.0.25.06+, 多选选项 "4" 已过时. 然而, 考虑到和旧脚本的兼容, 这个选项仍然可用. 具体是, 如果用户只选择了一个文件, 则 OutputVar 会包含这个文件的完整路径和名称跟着换行符 (`n). 如果用户选择了多个文件, 则格式和上面描述的 M 选项相同, 不过最后一项也会以换行符 (`n) 结束.

相关

FileSelectFolder, MsgBox, InputBox, ToolTip, GUI, CLSID 列表, 解析循环, SplitPath

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

示例

FileSelectFile, SelectedFile, 3, , Open a file, Text Documents (*.txt; *.doc)
if SelectedFile =
    MsgBox, The user didn't select anything.
else
    MsgBox, The user selected the following:`n%SelectedFile%


; CLSID 的例子(XP/2003 或早期系统中):
FileSelectFile, OutputVar,, ::{645ff040-5081-101b-9f08-00aa002f954e}  ; 回收站。

; 多选的例子:
FileSelectFile, files, M3  ; M3 = 选择多个现有文件。
if files =
{
    MsgBox, The user pressed cancel.
    return
}
Loop, parse, files, `n
{
    if a_index = 1
        MsgBox, The selected files are all contained in %A_LoopField%.
    else
    {
        MsgBox, 4, , The next file is %A_LoopField%.  Continue?
        IfMsgBox, No, break
    }
}
return