读取数据文件

从打开的数据文件读取数据。

选项 

  • 文件 ID”是一个数字表达式,指定了打开的数据文件的文件 ID。请参阅打开数据文件脚本步骤
  • 如果“读取为”为“UTF-8”或“字节”,则“”指定了要读取的字节数。对于“UTF-16”,“”为读取的 Unicode 代码单元数。如未指定“”(不作任何设置),将读取整个文件。
  • 目标”是用于存储从文件读取的数据的字段或变量。
  • 读取为”指定了文件的字符编码。
    • UTF-16”是 FileMaker 的默认 16 位 Unicode (UTF-16 little endian) 字符编码。
    • UTF-8”是 8 位 Unicode 字符编码。
    • 字节”假定没有特定的字符编码,而是一次读取一个字节。如果目标是变量或容器字段,则将从文件读取的数据存储为与指定文件具有相同文件名的容器数据。

兼容性 

产品 是否支持
FileMaker Pro
FileMaker Go
FileMaker WebDirect
FileMaker Server
FileMaker Cloud
FileMaker Data API
自定义 Web 发布

原始版本 

18.0

说明 

此脚本步骤从当前读写位置开始读取由“”指定的数据,如未指定“”,则读取整个文件。请参阅设置数据文件位置

此脚本步骤一次可读取的最大数据量为 64 MB。如果文件超过 64 Mb,则可以多次执行此脚本步骤,每次读取的数据量不超过 64 MB。

注释 

  • 读取不超过 64 KB 时,性能最佳。
  • 从部分文件读取 Unicode 文本时,如果字符由多个代码单元组成,则只能读取部分字符。如果您希望从 UTF-8 或 UTF-16 文件读取文本,除非确定每个字符的代码点数,否则一次读取整个文件可能更安全。

示例 1 

读取文件 ID 为 2 的打开的文件的内容,将数据存储在变量中。

复制
读取数据文件 [文件 ID:2 ; 量 (字节): ; 目标: $变量 ; 读取为:字节 ]

示例 2 

检查 Documents 文件夹中是否存在名为 change.log 的文件。如果存在,则将前 100 个 UTF-8 代码单元读入“实用工具::日志条目”文本字段。

复制
设置变量 [$文件; 值:Get (文档路径) & "change.log" ]
获取文件存在的值 [ "$文件" ; 目标: $文件已存在 ]
If [ $文件不存在 ]
    退出脚本 [ 文本结果: ]
End If
打开数据文件 ["$文件" ; 目标: $文件 ID ]
读取数据文件 [文件 ID: $文件 ID ; 量 (字节):100 ; 目标:实用工具::日志条目 ; 读取为:UTF-8 ]
关闭数据文件 [文件 ID: $文件 ID ]

示例 3 

如果 large.log 文件存在且较大,则一次将 64 Mb 的文件读入变量,直到读取整个文件。如果文件较小,则一次读取操作可读取整个文件。将数据读入变量以提高性能,然后将数据存储在字段中。

复制
设置错误捕获 [打开]
设置变量 [ $k_FileMissingError ; 值:100 ] 
设置变量 [ $k_EndOfFileError ; 值:10 ]
设置变量 [ $k_64KB ; 值:64 * 1024 ]
设置变量 [ $k_64MB ; 值:64 * 1024 * 1024 ]
设置变量 [$文件; 值: "large.log" ]
获取文件存在的值 [ "$文件" ; 目标: $文件已存在 ]
If [ $文件已存在 = 0 ]
    退出脚本 [ 结果: $k_FileMissingError ]
End If

打开数据文件 ["$文件" ; 目标: $文件 ID ] 

#如果文件成功打开,则读取内容。
If [ Get (上一个错误) = 0 ]
    获取文件大小 [ "$文件" ; 目标: $文件大小 ]

    #如果文件大小超过 64 KB,则一次读取 64 MB。
    If [ $文件大小 > $k_64KB ]

        Loop
            #最多读取 64 MB,并存储在变量中。
            读取数据文件 [文件 ID: $文件 ID ; 量 (字节): $k_64MB ; 目标: $数据块 ; 读取为:UTF-8 ]
            设置变量 [ $读取错误; 值:Get (上一个错误) ]

            #如果读取操作成功或到达文件末尾,则将在此传递中读取的数据 ($数据块) 与此前读取的数据 ($文件内容) 连接起来。
            If [ ( $读取错误 = 0 ) 或 ( $读取错误 = $k_EndOfFileError ) ]
                设置变量 [ $文件内容 ; 值: $文件内容 & $数据块 ]
            End If

            #如果读取操作失败或到达文件末尾,则退出循环。
            Exit Loop If [ $读取错误 ]
        End Loop

    Else
        #如果文件大小不超过 64 KB,则一次读取整个文件。
        读取数据文件 [文件 ID: $文件 ID ; 目标: $文件内容 ; 读取为:UTF-8 ]
    End If

    #关闭数据文件,将内容存储在字段中。
    关闭数据文件 [文件 ID: $文件 ID ]
    设置字段 [ 表::数据 ; $文件内容 ]

End If