<style type="text/css"> .sized { width: 3em; } </style> </head> <body> <h1>FileOpen</h1> <p>打开文件, 从其中读取特定内容和/或将新内容写入其中.</p> <pre class="Syntax">FileObj := <span class="func">FileOpen</span>(Filename, Flags <span class="optional">, Encoding</span>)</pre> <h2 id="Parameters">参数</h2> <dl> <dt>Filename</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a>或<a href="../Concepts.htm#numbers">整数</a> </p> <p>要打开文件的路径, 如果未指定绝对路径则假定在 <a href="../Variables.htm#WorkingDir">A_WorkingDir</a> 中.</p> <p>如下所示, 指定一个(或两个) 星号来打开标准输入(input)/输出(output)/错误(error) 流:</p> <pre> FileOpen("*", "r") <em>; 标准输入</em> FileOpen("*", "w") <em>; 标准输出</em> FileOpen("**", "w") <em>; 标准错误</em></pre> </dd> <dt>Flags</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>表示所需的访问模式的字符串, 后面跟着其他选项(中间有可选的空格或制表符); 或数字标志的组合(总和). 支持的值在下表中描述.</p> </dd> <dt>Encoding</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a>或<a href="../Concepts.htm#numbers">整数</a></p> <p>如果省略, 将使用默认编码(由 <a href="FileEncoding.htm">FileEncoding</a> 或 CP0 设置). 如果为空, 则默认为 CP0(系统默认的 ANSI 代码页). 否则, 指定用于文本 I/O 的编码或代码页, 例如 <code>"UTF-8"</code>, <code>"UTF-16"</code>, <code>"CP936"</code> 或 <code>936</code>.</p> <p>如果文件包含 UTF-8 或 UTF-16 字节顺序标记(BOM), 或者如果使用 <code>h</code>(句柄) 标记, 则该参数和默认编码将被忽略, 除非文件以只写访问方式打开(即文件的先前内容被丢弃).</p> </dd> </dl> <h2 id="Flags">Flags</h2> <h3 id="Access_modes">访问模式(互斥的)</h3> <table class="info"> <tr> <th class="sized center">Flag</th> <th class="sized right">十进制</th> <th class="sized right">十六进制</th> <th abbr="Descr">描述</th> </tr> <tr> <td class="center">r</td> <td class="right">0</td> <td class="right">0x0</td> <td><i>读取:</i> 当文件不存在时失败.</td> </tr> <tr> <td class="center">w</td> <td class="right">1</td> <td class="right">0x1</td> <td><i>写入:</i> 创建新文件, <b style="color:red">覆盖任意已存在的文件</b>.</td> </tr> <tr> <td class="center">a</td> <td class="right">2</td> <td class="right">0x2</td> <td><i>追加:</i> 如果文件不存在则创建新文件, 否则移动文件指针到文件末尾.</td> </tr> <tr> <td class="center">rw</td> <td class="right">3</td> <td class="right">0x3</td> <td><i>读取/写入:</i> 当文件不存在时创建新文件.</td> </tr> <tr> <td class="center">h</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>表示 <i>Filename</i> 是包装在对象中的文件句柄. 忽略共享模式标志, 并且不检查句柄表示的文件或流的字节顺序标记. 当文件对象销毁时, 当文件对象销毁时, 文件句柄 <u>不会</u> 自动关闭并且调用 <a href="File.htm#Close">File.Close</a> 没有效果. 注意当 <i>Filename</i> 是非搜寻设备(例如管道或通信设备) 的句柄时, 不应该使用 <a href="File.htm#Seek">File.Seek</a>, <a href="File.htm#Pos">File.Pos</a> 和 <a href="File.htm#Length">File.Length</a>.</td> </tr> </table> <h3 id="Sharing_mode_flags">共享模式标志</h3> <table class="info"> <tr> <th class="sized center">Flag</th> <th class="sized right">十进制</th> <th class="sized right">十六进制</th> <th abbr="Descr">描述</th> </tr> <tr> <td class="center">-rwd</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>为读取, 写入和/或删除访问进行文件锁定. 可以使用 <code>r</code>, <code>w</code> 和 <code>d</code> 的任意组合. 指定 <code>-</code> 相当于指定 <code>-rwd</code>. 如果完全省略, 默认为共享所有访问.</td> </tr> <tr> <td>&nbsp;</td> <td class="right">0</td> <td class="right">0x0</td> <td>如果 <i>Flags</i> 是数值的, 缺少共享模式标志会让文件被锁定.</td> </tr> <tr> <td>&nbsp;</td> <td class="right">256</td> <td class="right">0x100</td> <td>共享 <i>读取</i> 访问.</td> </tr> <tr> <td>&nbsp;</td> <td class="right">512</td> <td class="right">0x200</td> <td>共享 <i>写入</i> 访问.</td> </tr> <tr> <td>&nbsp;</td> <td class="right">1024</td> <td class="right">0x400</td> <td>共享 <i>删除</i> 访问.</td> </tr> </table> <h3 id="EOL_options">行结束符(EOL) 选项</h3> <table class="info"> <tr> <th class="sized center">Flag</th> <th class="sized right">十进制</th> <th class="sized right">十六进制</th> <th abbr="Descr">描述</th> </tr> <tr> <td class="center">`n</td> <td class="right">4</td> <td class="right">0x4</td> <td>读取时把 <code>`r`n</code> 替换为 <code>`n</code> 而写入时把 <code>`n</code> 替换为 <code>`r`n</code>.</td> </tr> <tr> <td class="center"><code>`r</code></td> <td class="right">8</td> <td class="right">0x8</td> <td>读取时把单独的 <code>`r</code> 替换为 <code>`n</code>.</td> </tr> </table> <h2 id="Return_Value">返回值</h2> <p>类型: <a href="../Concepts.htm#objects">Object</a></p> <p>返回值是一个封装文件打开句柄的新<a href="File.htm">文件对象</a>. 使用此对象的方法和属性来访问文件的内容.</p> <h2 id="Errors">错误</h2> <p>如果文件不能打开, 则抛出 <a href="Error.htm#OSError">OSError</a>.</p> <h2 id="Remarks">备注</h2> <p><a href="File.htm#ReadLine">File.ReadLine</a> 始终支持 <code>`n</code>, <code>`r`n</code> 和 <code>`r</code> 作为行结束符, 并且不将它们包含在返回值中, 无论是否使用 <code>`r</code> 或 <code>`n</code> 选项. 这些选项仅影响 <a href="File.htm#Read">File.Read</a> 返回的或由 <a href="File.htm#Write">File.Write</a> 或 <a href="File.htm#WriteLine">File.WriteLine</a> 写入的文本中的行结束符的转换.</p> <p>当创建 UTF-8 或 UTF-16 文件时, 会写入字节顺序标记(BOM) 到文件中, <u>除非</u> <em>Encoding</em> 或默认编码(由 <a href="FileEncoding.htm">FileEncoding</a> 设置) 是 <code>"UTF-8-RAW"</code> 或 <code>"UTF-16-RAW"</code>.</p> <p>当以读取方式打开含有 UTF-8 或 UTF-16 字节顺序标记(BOM) 的文件时, 会把文件指针放置到这个标志后, 来从输出中排除 BOM. 因此, 在刚刚打开这样的文件时 <a href="File.htm#Pos">File.Pos</a> 可能为 3 或 2.</p> <h2 id="Related">相关</h2> <p><a href="FileEncoding.htm">FileEncoding</a>, <a href="File.htm">文件对象</a>, <a href="FileRead.htm">FileRead</a></p> <h2 id="Examples">示例</h2> <div class="ex" id="ExWriteRead"> <p><a class="ex_number" href="#ExWriteRead"></a> 写入一些文本到文件, 然后从文件读取回内存(它提供了与这个 <a href="DllCall.htm#ExFile">DllCall 示例</a>相同的功能).</p> <pre>FileName := FileSelect("S16",, "Create a new file:") if (FileName = "") return try FileObj := FileOpen(FileName, "w") catch as Err { MsgBox "Can't open '" FileName "' for writing." . "`n`nError " Err.Extra ": " Err.Message return } TestString := "This is a test string.`r`n" <em>; 通过这种方式写入内容到文件时, 要使用 `r`n 而不是 `n 来开始新行.</em> FileObj.Write(TestString) FileObj.Close() <em>; 现在已经把内容写入文件了, 把它们读取回内存中.</em> try FileObj := FileOpen(FileName, "r-d") <em>; 读取文件 ("r"), 共享除了删除 ("-d") 外的所有访问权限</em> catch as Err { MsgBox "Can't open '" FileName "' for reading." . "`n`n" Type(Err) ": " Err.Message return } CharsToRead := StrLen(TestString) TestString := FileObj.Read(CharsToRead) FileObj.Close() MsgBox "The following string was read from the file: " TestString</pre> </div> <div class="ex" id="ExReadLine"> <p><a class="ex_number" href="#ExReadLine"></a> 以只读模式打开脚本并读取它的首行.</p> <pre>Script := FileOpen(A_ScriptFullPath, "r") MsgBox Script.ReadLine()</pre> </div> <div class="ex" id="ExStreams"> <p><a class="ex_number" href="#ExStreams"></a> 演示标准 input/output 流的用法.</p> <pre><em>; 打开控制台窗口以进行此次演示:</em> DllCall("AllocConsole") <em>; 打开应用程序的 stdin/stdout 流.</em> stdin := FileOpen("*", "r") stdout := FileOpen("*", "w") stdout.Write("Enter your query.`n\&gt; ") stdout.Read(0) <em>; 清除写入缓冲区.</em> query := RTrim(stdin.ReadLine(), "`n") stdout.WriteLine("Your query was '" query "'. Have a nice day.") stdout.Read(0) <em>; 清除写入缓冲区.</em> Sleep 5000 </pre> </div> </body> </html>