Erlang模块file翻译
程序员文章站
2022-03-02 09:13:23
模块摘要 文件接口模块 描述 模块file提供了文件系统的接口。 在具有线程支持的操作系统上,可以让文件操作以其自己的线程执行,从而允许其他Erlang进程与文件操作并行地继续执行。在ERL(1)查看命令行标记 +A。 Erlang虚拟机在一定程度上支持Unicode的文件名。根据VM的启动方式(使 ......
模块摘要
文件接口模块
描述
模块file提供了文件系统的接口。
在具有线程支持的操作系统上,可以让文件操作以其自己的线程执行,从而允许其他Erlang进程与文件操作并行地继续执行。在ERL(1)查看命令行标记 +A。
Erlang虚拟机在一定程度上支持Unicode的文件名。根据VM的启动方式(使用参数 + fnu或+ fnl),给定的文件名可以包含大于255的字符,VM系统会将文件名来回转换为本地文件名编码。
Unicode字符转换的默认行为取决于底层操作系统/文件系统强制执行一致命名的程度。在确保所有文件名都采用一种或另一种编码的操作系统上,Unicode是默认值(目前这适用于Windows和MacOSX)。在具有完全透明文件命名的操作系统上(即除MacOSX以外的所有Unix),ISO-latin-1文件命名是默认的。ISO-latin-1默认的原因是文件名不能保证可以根据预期的Unicode编码进行解释(即UTF-8),并且不能解码的文件名只能通过使用“raw文件名“,其他文件名称为二进制文件。
由于文件名通常不是Erlang中的二进制文件,因此需要转换需要处理原始文件名的应用程序,这就是为什么文件名的Unicode模式在具有完全透明文件命名的系统上不是默认值。
原始文件名是OTP R14B01中的一项新功能,它允许用户将完全未解释的文件名提供给底层操作系统/文件系统。它们以二进制文件形式提供,用户可以根据环境提供正确的编码。函数file:native_name_encoding()可用于检查虚拟机正在工作的编码。如果该函数返回latin1文件名不会以任何方式转换为Unicode,如果它是utf8,如果原始文件名要遵循VM的约定(通常也是OS的约定),则应将其编码为UTF-8。如果您的文件系统具有不一致的文件命名,则使用原始文件名非常有用,其中一些文件以UTF-8编码命名,而其他文件则不以此命名。当虚拟机处于Unicode文件名模式时,这种混合文件名系统上file:list_dir可能会将文件名作为原始二进制文件返回,因为它们不能被解释为Unicode文件名。即使虚拟机未以Unicode文件名翻译模式启动,原始文件名也可用于提供UTF-8编码的文件名。
请注意,在Windows上,即使在Windows上,file:native_name_encoding()也会在默认情况下返回utf8,即使在Windows上也是原始文件名的格式,但底层操作系统特定的代码在小尾数UTF16的限制版本中工作。就Erlang程序员而言,Windows原生Unicode格式是UTF-8 ...
数据类型
deep_list() = [char()| atom()| deep_list() ]
FD()
表示以原始模式打开的文件的文件描述符。
filename() = string()
filename_all() = string()| binary()
io_device() = pid()| FD()
由file:open/2文件; pid()是一个处理I/O协议的进程。
name() = string()| atom()| deep_list()
如果VM处于Unicode文件名模式,则string()和char() 允许大于255。
name_all() = string()| atom()| deep_list()| (RawFilename :: binary())
如果VM处于Unicode文件名模式,string()和char() 允许大于255. RawFilename是不受Unicode转换影响的文件名,这意味着它可以包含不符合文件系统期望的Unicode编码的字符尽管虚拟机在Unicode文件名模式下启动,但是不支持UTF-8字符)。
posix() = eacces
| eagain
| ebadf
| ebusy
| edquot
| eexist
| efault
| efbig
| eintr
| einval
| eio
| eisdir
| eloop
| emfile
| emlink
| enametoolong
| enfile
| enodev
| enoent
| enomem
| enospc
| enotblk
| enotdir
| enotsup
| enxio
| eperm
| epipe
| erofs
| espipe
| esrch
| estale
| exdev
一个由Unix中使用的POSIX错误代码以及大多数C编译器的运行时库中命名的原子。
date_time() = calendar:datetime()
必须表示有效的日期和时间。
file_info() =
#file_info{size = undefined | integer() >= 0,
type = undefined
| device
| directory
| other
| regular
| symlink,
access = undefined
| read
| write
| read_write
| none,
atime = undefined
| file:date_time()
| integer() >= 0,
mtime = undefined
| file:date_time()
| integer() >= 0,
ctime = undefined
| file:date_time()
| integer() >= 0,
mode = undefined | integer() >= 0,
links = undefined | integer() >= 0,
major_device = undefined | integer() >= 0,
minor_device = undefined | integer() >= 0,
inode = undefined | integer() >= 0,
uid = undefined | integer() >= 0,
gid = undefined | integer() >= 0}
location() = integer()
| {bof, Offset :: integer()}
| {cur, Offset :: integer()}
| {eof, Offset :: integer()}
| bof
| cur
| eof
mode() = read
| write
| append
| exclusive
| raw
| binary
| {delayed_write,
Size :: integer() >= 0,
Delay :: integer() >= 0}
| delayed_write
| {read_ahead, Size :: integer() >= 1}
| read_ahead
| compressed
| {encoding, unicode:encoding()}
file_info_option() = {time, local} | {time, universal} | {time, posix}
导出
advise(IoDevice, Offset, Length, Advise) -> ok | {error, Reason}
Types:
IoDevice = io_device()
Offset = Length = integer()
Advise = posix_file_advise()
Reason = posix() | badarg
posix_file_advise() = normal
| sequential
| random
| no_reuse
| will_need
| dont_need
advise/4可用于宣布将来以特定模式访问文件数据的意图,从而允许操作系统执行适当的优化。
在某些平台上,此功能可能不起作用。
allocate(File, Offset, Length) -> ok | {error, posix()}
Types:
File = io_device()
Offset = Length = integer() >= 0
allocate/3可用于为文件预分配空间。
此功能仅在实现此功能的平台上成功。成功时,为文件预分配空间,但文件大小可能不会更新。这种行为取决于预分配实现。为了保证文件大小更新,必须将文件截断为新的大小。
change_group(Filename, Gid) -> ok | {error, Reason}
Types:
Filename = name_all()
Gid = integer()
Reason = posix() | badarg
更改文件组。请参阅 write_file_info/2。
change_mode(Filename, Mode) -> ok | {error, Reason}
Types:
Filename = name_all()
Mode = integer()
Reason = posix() | badarg
更改文件的权限。请参阅 write_file_info/2。
change_owner(Filename, Uid) -> ok | {error, Reason}
Types:
Filename = name_all()
Uid = integer()
Reason = posix() | badarg
更改文件的所有者和组。请参阅 write_file_info/2。
change_time(Filename, Mtime) -> ok | {error, Reason}
Types:
Filename = name_all()
Mtime = date_time()
Reason = posix() | badarg
更改文件的修改和访问时间。请参阅 write_file_info/2。
close(IoDevice) -> ok | {error, Reason}
Types:
IoDevice = io_device()
Reason = posix() | badarg | terminated
关闭IoDevice引用的文件。它通常会返回正常,预计会出现诸如内存不足等严重错误。
请注意,如果在打开文件时使用了选项delayed_write,则close/1可能会返回旧的写入错误,甚至不会尝试关闭该文件。见open/2。
consult(Filename) -> {ok, Terms} | {error, Reason}
Types:
Filename = name_all()
Terms = [term()]
Reason = posix()
| badarg
| terminated
| system_limit
| {Line :: integer(), Mod :: module(), Term :: term()}
从Filename中读取由'.'分隔的Erlang项 。返回以下内容之一:
{ok,Terms}
该文件已成功读取。
{error,atom()}
打开文件或读取文件时发生错误。有关典型错误代码的列表,请参阅open/2。
{error,{Line,Mod,Term}}
解释文件中的Erlang项时发生错误。使用format_error/1将三元素元组转换为错误的英文描述。
例子:
f.txt: {person, "kalle", 25}.
{person, "pelle", 30}.
1> file:consult("f.txt").
{ok,[{person,"kalle",25},{person,"pelle",30}]}
文件名的编码可以通过epp(3)中描述的注释来设置。
copy(Source, Destination) -> {ok, BytesCopied} | {error, Reason}
copy(Source, Destination, ByteCount) -> {ok, BytesCopied} | {error, Reason}
Types:
Source = Destination = io_device() | Filename | {Filename, Modes}
Filename = name_all()
Modes = [mode()]
ByteCount = integer() >= 0 | infinity
BytesCopied = integer() >= 0
Reason = posix() | badarg | terminated
从Source到Destination复制ByteCount字节 。 Source和Destination是指来自例如open/2的文件名或IO设备。 ByteCount默认为infinity,表示无限数量的字节。
Modes模式是可能模式的列表,请参阅open/2,默认为[]。
如果Source和 Destination都指向文件名,那么这些文件分别以[read,binary] 和[write,binary]作为模式列表的预先打开,以优化副本。
如果Source引用一个文件名,则在拷贝之前以读取模式打开,并在完成时关闭。
如果Destination指向一个文件名,它会在复制之前以模式列表预先以写入模式打开,并在完成时关闭。
返回{ok,BytesCopied},其中BytesCopied是实际复制的字节数,如果在源上遇到文件结尾,则可能小于ByteCount。如果操作失败, 则返回{error,Reason}。
典型的错误原因:至于open/2,如果一个文件必须打开,以及read/2和write/2。
del_dir(Dir) -> ok | {error, Reason}
Types:
Dir = name_all()
Reason = posix() | badarg
尝试删除目录Dir。该目录在被删除之前必须是空的。成功返回ok。
典型的错误原因是:
eacces
Dir的父目录缺少搜索或写入权限。
eexist
该目录不是空的。
enoent
该目录不存在。
enodir
Dir的一个组件不是一个目录。在某些平台上,取而代之的是返回enoent。
einval
尝试删除当前目录。在某些平台上,eacces被返回。
delete(Filename) -> ok | {error, Reason}
Types:
Filename = name_all()
Reason = posix() | badarg
试图删除文件Filename。成功返回ok。
典型的错误原因是:
enoent
该文件不存在。
eacces
对该文件或其父母之一缺少权限。
eperm
该文件是一个目录,用户不是超级用户。
enotdir
文件名的一个组件不是一个目录。在某些平台上,取而代之的是返回enoent。
einval
文件名具有不正确的类型,例如元组。
警告
在未来的版本中,Filename参数的错误类型 可能会生成异常。
eval(Filename) -> ok | {error, Reason}
Types:
Filename = name_all()
Reason = posix()
| badarg
| terminated
| system_limit
| {Line :: integer(), Mod :: module(), Term :: term()}
读取和运算由'.'分隔的Erlang表达式(或',',一系列表达式也是一个表达式),来自 Filename。运算的实际结果不返回;文件中的任何表达式序列都必须存在,因为它的副作用。返回以下内容之一:
ok
该文件被读取和运算。
{error,atom()}
打开文件或读取文件时发生错误。有关典型错误代码的列表,请参阅open/2。
{error,{Line,Mod,Term}}
解释文件中的Erlang表达式时发生错误。使用format_error/1将三元素元组转换为错误的英文描述。
文件名的编码可以通过epp(3)中描述的注释来设置。
eval(Filename, Bindings) -> ok | {error, Reason}
Types:
Filename = name_all()
Bindings = erl_eval:binding_struct()
Reason = posix()
| badarg
| terminated
| system_limit
| {Line :: integer(), Mod :: module(), Term :: term()}
与eval/1相同,但变量绑定 Bindings用于运算。请参阅 erl_eval(3)关于变量绑定。
file_info(Filename) -> {ok, FileInfo} | {error, Reason}
Types:
Filename = name_all()
FileInfo = file_info()
Reason = posix() | badarg
此功能已过时。 改为使用read_file_info/1,2。
format_error(Reason) -> Chars
Types:
Reason = posix()
| badarg
| terminated
| system_limit
| {Line :: integer(), Mod :: module(), Term :: term()}
Chars = string()
鉴于此模块中任何函数返回的错误原因,请返回英文错误的描述性字符串。
get_cwd() -> {ok, Dir} | {error, Reason}
Types:
Dir = filename()
Reason = posix()
返回{ok,Dir},其中Dir 是文件服务器的当前工作目录。
注意
在极少数情况下,这个函数可能在Unix上失败。如果当前目录的父目录不存在读取权限,则可能发生这种情况。
典型的错误原因是:
eacces
缺少当前目录的其中一个父项的读取权限。
get_cwd(Drive) -> {ok, Dir} | {error, Reason}
Types:
Drive = string()
Dir = filename()
Reason = posix() | badarg
驱动器的格式应为“ Letter:”,例如“c:”。返回{ok,Dir}或 {error,Reason},其中Dir 是指定驱动器的当前工作目录。
该函数在没有当前驱动器概念的平台(例如Unix)上返回{error,enotsup}。
典型的错误原因是:
enotsup
操作系统没有驱动器的概念。
eacces
该驱动器不存在。
einval
云端硬盘的格式无效。
list_dir(Dir) -> {ok, Filenames} | {error, Reason}
Types:
Dir = name_all()
Filenames = [filename()]
Reason = posix()
| badarg
| {no_translation, Filename :: unicode:latin1_binary()}
列出目录中的所有文件,但具有“原始”名称的文件除外。如果成功,返回 {ok,Filenames}。否则,它返回{error,Reason}。 文件名是目录中所有文件名称的列表。名称没有排序。
典型的错误原因是:
eacces
Dir或其父目录之一缺少搜索或写入权限。
enoent
该目录不存在。
{no_translation,Filename}
Filename是一个二进制,其字符在ISO-latin-1中编码,VM以参数+ fnue启动。
list_dir_all(Dir) -> {ok, Filenames} | {error, Reason}
Types:
Dir = name_all()
Filenames = [filename_all()]
Reason = posix() | badarg
列出目录中的所有文件,包括具有“原始”名称的文件。如果成功,返回{ok,Filenames}。否则,它返回{error,Reason}。 文件名是目录中所有文件名称的列表。名称没有排序。
典型的错误原因是:
eacces
Dir或其父目录之一缺少搜索或写入权限。
enoent
该目录不存在。
make_dir(Dir) -> ok | {error, Reason}
Types:
Dir = name_all()
Reason = posix() | badarg
尝试创建目录Dir。缺少父目录不能创建。成功返回ok。
典型的错误原因是:
eacces
Dir的父目录缺少搜索或写入权限。
eexist
已经有一个名为Dir的文件或目录。
enoent
Dir的一个组件不存在。
enospc
设备上没有剩余空间。
enotdir
Dir的一个组件不是一个目录。在某些平台上,取而代之的是返回enoent。
make_link(Existing, New) -> ok | {error, Reason}
Types:
Existing = New = name_all()
Reason = posix() | badarg
在支持链接的平台(Unix和Windows)上建立从Existing到 New的硬链接。如果链接成功创建,该函数返回ok,或 {error,Reason}。在不支持链接的平台上,返回{error,enotsup}。
典型的错误原因:
eacces
缺少Existing或 New的父目录的读取或写入权限。
eexist
新已经存在。
enosup
该平台不支持硬链接。
make_symlink(Existing, New) -> ok | {error, Reason}
Types:
Existing = New = name_all()
Reason = posix() | badarg
在支持符号链接(大多数Unix系统和Windows以Vista开头)的平台上,该函数创建一个文件或目录Existing的新符号链接。 Existing需要不存在。如果链接成功创建,该函数返回ok,或{error,Reason}。在不支持符号链接的平台上, 返回{error,enotsup}。
典型的错误原因:
eacces
缺少Existing或New的父目录的读取或写入权限。
eexist
新已经存在。
enotsup
此平台不支持符号链接。
native_name_encoding() -> latin1 | utf8
此函数返回配置的默认文件名编码以用于原始文件名。通常,提供文件名raw(作为二进制文件)的应用程序应该服从由该函数返回的字符编码。
默认情况下,VM在文件系统和/或使用完全透明文件命名的操作系统上使用ISO-latin-1文件名编码。这包括除MacOSX之外的所有Unix版本,其中vfs层强制执行UTF-8文件命名。通过在启动Erlang时给出实验选项+ fnu,即使对于那些系统,也可以打开文件名的UTF-8转换。如果Unicode文件名翻译生效,只要文件名符合编码,系统就会照常运行,但会返回未正确编码为UTF-8的文件名作为原始文件名(即二进制文件)。
在Windows上,该函数默认返回utf8。操作系统使用纯粹的Unicode命名方案,文件名总是可以解释为有效的Unicode。底层Windows操作系统实际上使用小尾数UTF-16编码文件名的事实可以被Erlang程序员忽略。Windows和MacOSX是虚拟机默认以Unicode文件名模式运行的唯一操作系统。
open(File, Modes) -> {ok, IoDevice} | {error, Reason}
Types:
File = Filename | iodata()
Filename = name_all()
Modes = [mode() | ram]
IoDevice = io_device()
Reason = posix() | badarg | system_limit
以由Modes确定的模式打开文件File,该模式可能包含以下一项或多项内容:
read
该文件必须存在,已打开供阅读。
write
该文件被打开写入。如果它不存在,则创建它。如果该文件存在,并且如果写入未与读取结合,则该文件将被截断。
append
该文件将被打开进行写入,并且如果该文件不存在,该文件将被创建。对使用append打开的文件的每个写入操作都将在文件末尾进行。
exclusive
如果该文件在写入时打开,则该文件如果不存在则创建。如果文件存在,打开将返回 {error,eexist}。
警告
此选项不保证在不支持O_EXCL的文件系统上的排他性,例如NFS。除非您知道文件系统支持该选项,否则不要依赖此选项(通常,本地文件系统应该是安全的)。
raw
该raw选项允许一个文件更快的访问,因为不需要Erlang进程来处理文件。但是,以这种方式打开的文件具有以下限制:
io模块中的功能无法使用,因为它们只能与Erlang进程通信。相反,使用read/2,read_line/1和 write/2 函数。
特别是如果要在原始文件上使用read_line/1,建议将此选项与{read_ahead,Size}选项结合使用,因为面向行的I/O效率不高而不缓冲。
只有打开文件的Erlang进程才能使用它。
远程Erlang文件服务器不能使用; 运行Erlang节点的计算机必须能够访问文件系统(直接或通过NFS)。
binary
当给出这个选项时,对文件的读操作将返回二进制文件而不是列表。
{delayed_write,Size,Delay}
如果使用此选项,则后续write/2调用中的数据将被缓冲,直到至少有Size字节被缓冲,或者直到最早的缓冲数据为Delay毫秒。然后将所有缓冲数据写入一个操作系统调用中。在write/2执行之前,缓存的数据在其他文件操作之前也会被刷新。
此选项的目的是通过减少操作系统调用的数量来提高性能,所以 write/2调用的尺寸应该大大小于Size,并且不会穿插其他许多文件操作,因此会发生这种情况。
使用此选项时,write/2调用的结果可能会过早地报告为成功,并且如果实际发生写入错误,则会将错误报告为下一个文件操作的结果,该操作不会执行。
例如,当使用delayed_write时,经过多次write/2调用后,close/1可能会返回{error,enospc},因为光盘上没有足够的空间用于先前写入的数据,并且可能再次调用close/1因为该文件仍处于打开状态。
delayed_write
与{Delay_write,Size,Delay}相同,使用Size和 Delay的合理默认值。(大约64 KB,2秒)
{read_ahead, Size}
该选项激活读取数据缓冲。如果 read/2调用的字节数大大小于Size字节,则对操作系统的读取操作仍会针对Size 字节块执行。额外的数据被缓冲并在随后的read/2调用中返回,从而减少操作系统调用次数,从而提高性能。
所述read_ahead缓冲器也是高度由利用read_line/1在功能原始模式下,为什么建议该选项(出于性能原因)使用该函数访问原始文件时。
如果read/2调用的大小不小于或大于size字节,则不会获得性能增益。
read_ahead
同为{read_ahead,Size}有一个合理的默认值大小。(大约64 KB)
compressed
使读取或写入gzip压缩文件成为可能。该压缩选项必须以组合读或写,但不能同时使用。请注意,使用read_file_info/1获取的文件大小 很可能与可从压缩文件读取的字节数不匹配。
{encoding, Encoding}
使文件自动转换特定(Unicode)编码中的字符。请注意,提供给file:write或由file:read返回的数据仍然是面向字节的,该选项仅表示数据实际存储在磁盘文件中的方式。
根据编码的不同,读取和写入数据的方法是首选。latin1的默认编码意味着使用这个(文件)模块读取和写入数据,因为这里提供的接口使用面向字节的数据,而使用其他(Unicode)编码使得io(3)模块的get_chars,get_line和put_chars功能更适合,因为它们可以使用完整的Unicode范围。
如果数据以无法转换为指定编码的格式发送到io_device(),或者数据是以无法应对数据字符范围的格式返回数据的函数读取的,则会发生错误,并且该文件将被关闭。
编码的允许值是:
LATIN1
默认编码。提供给ie file:write的字节按原样写入文件,同样从文件读取的字节返回到ie file:read。如果使用io(3)模块进行写入,则该文件只能处理直至代码点255(ISO-latin-1范围)的Unicode字符。
unicode或utf8
在写入文件或从文件中读取字符之前,字符会转换为UTF-8编码或从UTF-8编码转换而来。只要没有存储在文件中的数据超出ISO-latin-1范围(0..255),以这种方式打开的文件就可以使用file:read函数读取,但如果数据包含Unicode超出该范围的码点。该文件最好使用支持Unicode的io(3)模块中的函数进行读取 。
在实际存储到磁盘文件之前,通过任何方式写入文件的字节都会转换为UTF-8编码。
utf16或{utf16,big}
像unicode一样工作,但是可以在大端的UTF-16而不是UTF-8上进行翻译。
{UTF16,little}
像unicode一样工作,但翻译是通过小端UTF-16而不是UTF-8完成的。
utf32或{utf32,big}
像unicode一样工作,但是可以在大端的UTF-32而不是UTF-8上进行翻译。
{UTF32,little}
像unicode一样工作,但是可以使用小端UTF-32而不是UTF-8进行翻译。
编码可以通过使用io:setopts/2函数为“即时”文件进行更改,为什么可以使用latin1编码对文件进行分析,例如BOM,位于BOM之后,然后设置为正确的编码进一步阅读。参见unicode(3)模块了解BOM的功能。
原始文件不允许使用此选项。
ram
文件必须是iodata()。返回一个fd(),它使文件模块对内存中的数据进行操作,就像它是一个文件一样。
返回:
{ok,IoDevice}
该文件已在请求的模式下打开。 IoDevice是对该文件的引用。
{error, Reason}
该文件无法打开。
IoDevice实际上是处理文件的过程的pid。这个过程与最初打开文件的过程相关联。如果IoDevice链接的任何进程终止,则文件将被关闭,进程本身将被终止。从此调用返回的IoDevice可用作IO函数的参数(请参阅 io(3))。
注意
在以前版本的文件,模式都给出一个原子read,write,或read_write,而不是一个列表。出于向后兼容的原因,这仍然是允许的,但不应该用于新代码。另请注意,模式列表中不允许使用read_write。
典型的错误原因:
enoent
该文件不存在。
eacces
缺少权限读取文件或搜索其中一个父目录。
eisdir
指定的文件不是常规文件。它可能是一个目录,一个fifo或一个设备。
enotdir
文件名的一个组件不是一个目录。在某些平台上,取而代之的是返回enoent。
enospc
设备上没有剩余空间(如果 指定了写访问权限)。
path_consult(Path, Filename) -> {ok, Terms, FullName} | {error, Reason}
Types:
Path = [Dir]
Dir = Filename = name_all()
Terms = [term()]
FullName = filename_all()
Reason = posix()
| badarg
| terminated
| system_limit
| {Line :: integer(), Mod :: module(), Term :: term()}
搜索路径Path(目录名称列表),直到找到文件Filename。如果文件名是绝对文件名,则路径被忽略。然后从文件中读取用'.'分隔的Erlang项。返回以下内容之一:
{ok,Terms,FullName}
该文件已成功读取。FullName是文件的全名。
{error,enoent}
该文件无法在Path中的任何目录中找到 。
{error,atom()}
打开文件或读取文件时发生错误。有关典型错误代码的列表,请参阅open/2。
{error,{Line,Mod,Term}}
解释文件中的Erlang项时发生错误。使用format_error/1将三元素元组转换为错误的英文描述。
文件名的编码可以通过epp(3)中描述的注释来设置。
path_eval(Path, Filename) -> {ok, FullName} | {error, Reason}
Types:
Path = [Dir :: name_all()]
Filename = name_all()
FullName = filename_all()
Reason = posix()
| badarg
| terminated
| system_limit
| {Line :: integer(), Mod :: module(), Term :: term()}
搜索路径Path(目录名称列表),直到找到文件Filename。如果文件名是绝对文件名,则路径被忽略。然后读取并运算由'.'分隔的Erlang表达式。(或',',表达式序列也是一个表达式)。运算的实际结果不返回;文件中的任何表达式序列都必须存在,因为它的副作用。返回以下内容之一:
{ok,FullName}
该文件被读取和运算。FullName是文件的全名。
{error,enoent}
该文件无法在Path中的任何目录中找到 。
{error,atom()}
打开文件或读取文件时发生错误。有关典型错误代码的列表,请参阅open/2。
{error,{Line,Mod,Term}}
解释文件中的Erlang表达式时发生错误。使用format_error/1将三元素元组转换为错误的英文描述。
文件名的编码可以通过epp(3)中描述的注释来设置。
path_open(Path, Filename, Modes) -> {ok, IoDevice, FullName} | {error, Reason}
Types:
Path = [Dir :: name_all()]
Filename = name_all()
Modes = [mode()]
IoDevice = io_device()
FullName = filename_all()
Reason = posix() | badarg | system_limit
搜索路径Path(目录名称列表),直到找到文件Filename。如果文件名是绝对文件名,则路径被忽略。然后以Modes确定的模式打开文件。返回以下内容之一:
{ok,IoDevice,FullName}
该文件已在请求的模式下打开。 IoDevice是对文件的引用,FullName是文件的全名。
{错误,enoent}
该文件无法在Path中的任何目录中找到 。
{error,atom()}
该文件无法打开。
path_script(Path, Filename) -> {ok, Value, FullName} | {error, Reason}
Types:
Path = [Dir :: name_all()]
Filename = name_all()
Value = term()
FullName = filename_all()
Reason = posix()
| badarg
| terminated
| system_limit
| {Line :: integer(), Mod :: module(), Term :: term()}
搜索路径Path(目录名称列表),直到找到文件Filename。如果文件名是绝对文件名,则路径被忽略。然后读取并运算由'.'分隔的Erlang表达式。(或',',表达式序列也是一个表达式)。返回以下内容之一:
{ok,Value,FullName}
该文件被读取和运算。全名是文件的全名值的最后一个表达式的值。
{error,enoent}
该文件无法在Path中的任何目录中找到 。
{error,atom()}
打开文件或读取文件时发生错误。有关典型错误代码的列表,请参阅open/2。
{error,{Line,Mod,Term}}
解释文件中的Erlang表达式时发生错误。使用format_error/1将三元素元组转换为错误的英文描述。
文件名的编码可以通过epp(3)中描述的注释来设置。
path_script(Path, Filename) -> {ok, Value, FullName} | {error, Reason}
Types:
Path = [Dir :: name_all()]
Filename = name_all()
Value = term()
FullName = filename_all()
Reason = posix()
| badarg
| terminated
| system_limit
| {Line :: integer(), Mod :: module(), Term :: term()}
搜索路径Path(目录名称列表),直到找到文件Filename。如果文件名是绝对文件名,则路径被忽略。然后读取并运算由'.'分隔的Erlang表达式。(或',',表达式序列也是一个表达式)。返回以下内容之一:
{ok,Value,FullName}
该文件被读取和运算。全名是文件的全名值的最后一个表达式的值。
{error,enoent}
该文件无法在Path中的任何目录中找到 。
{error,atom()}
打开文件或读取文件时发生错误。有关典型错误代码的列表,请参阅open / 2。
{error,{Line,Mod,Term}}
解释文件中的Erlang表达式时发生错误。使用format_error/1将三元素元组转换为错误的英文描述。
文件名的编码可以通过epp(3)中描述的注释来设置。
path_script(Path, Filename, Bindings) -> {ok, Value, FullName} | {error, Reason}
Types:
Path = [Dir :: name_all()]
Filename = name_all()
Bindings = erl_eval:binding_struct()
Value = term()
FullName = filename_all()
Reason = posix()
| badarg
| terminated
| system_limit
| {Line :: integer(), Mod :: module(), Term :: term()}
与path_script/2相同,但在运算中使用变量绑定Bindings。请参阅 erl_eval(3)关于变量绑定。
pid2name(Pid) -> {ok, Filename} | undefined
Types:
Filename = filename_all()
Pid = pid()
如果Pid是IO设备,即从open/2返回的pid,则此函数返回文件名,或者更确切地说:
{ok,Filename}
如果此节点的文件服务器不是从属节点,则该节点的文件服务器将打开文件(这意味着 Pid必须是本地pid),并且该文件未关闭。文件名是字符串格式的文件名。
undefined
在所有其他情况下。
警告
该功能仅用于调试。
position(IoDevice, Location) -> {ok, NewPosition} | {error, Reason}
Types:
IoDevice = io_device()
Location = location()
NewPosition = integer()
Reason = posix() | badarg | terminated
将IoDevice引用的文件的位置设置为Location。如果成功,则返回 {ok,NewPosition}(作为绝对偏移量),否则返回 {error,Reason}。Location是以下之一:
Offset
与{bof,Offset}相同。
{bof,Offset}
绝对偏移量。
{cur,Offset}
从当前位置偏移。
{eof,Offset}
从文件末尾偏移。
bof | cur | EOF
与Offset 0 相同。
请注意,偏移量以字节计,而不是字符。如果使用除latin1之外的其他编码打开文件,则一个字节不对应一个字符。在这样的文件中定位只能通过已知的字符边界完成,也就是说,通过获取当前位置,到文件的开始/结尾或其他某些已知位于正确字符边界的位置(通常超出文件中的字节顺序标记,它具有已知的字节大小)。
典型的错误原因是:
einval
无论是位置是非法的,或在文件中其偏移量计算为负。请注意,如果结果位置为负值,则结果为错误,并且在调用后文件位置未定义。
pread(IoDevice, LocNums) -> {ok, DataL} | eof | {error, Reason}
Types:
IoDevice = io_device()
LocNums = [{Location :: location(), Number :: integer() >= 0}]
DataL = [Data]
Data = string() | binary() | eof
Reason = posix() | badarg | terminated
在一次操作中执行pread/3的序列,这比一次调用它们更有效。返回{ok,[Data,...]}或 {error,Reason},其中每个Data(相应的pread的结果 )可以是列表或二进制文件,具体取决于文件的模式,或者eof,如果请求位置超出了文件结尾。
由于位置是以字节偏移量给出的,因此在处理编码设置为latin1以外的文件时必须特别小心,因为并非每个字节位置都是此类文件上的有效字符边界。
pread(IoDevice, Location, Number) -> {ok, Data} | eof | {error, Reason}
Types:
IoDevice = io_device()
Location = location()
Number = integer() >= 0
Data = string() | binary()
Reason = posix() | badarg | terminated
在一次操作中合并position/2和read/2,这比一次调用它们更有效。如果IoDevice已在原始模式下打开,则会有一些限制:位置只允许为整数; 操作后,文件的当前位置未定义。
由于位置是以字节偏移量给出的,因此在处理编码设置为latin1以外的文件时必须特别小心,因为并非每个字节位置都是此类文件上的有效字符边界。
pwrite(IoDevice, LocBytes) -> ok | {error, {N, Reason}}
Types:
IoDevice = io_device()
LocBytes = [{Location :: location(), Bytes :: iodata()}]
N = integer() >= 0
Reason = posix() | badarg | terminated
在一次操作中执行一系列pwrite/3,这比一次调用一个更有效。返回ok或{error,{N,Reason}},其中 N是在失败之前完成的成功写入次数。
当使用除latin1之外的其他编码定位文件时,必须注意将位置设置在正确的字符边界上,详情请参阅position/2。
read(IoDevice, Number) -> {ok, Data} | eof | {error, Reason}
Types:
IoDevice = io_device() | atom()
Number = integer() >= 0
Data = string() | binary()
Reason = posix()
| badarg
| terminated
| {no_translation, unicode, latin1}
从IoDevice引用的文件读取Number字节/字符。read/2,pread/3 和read_line/1函数是从原始模式打开的文件读取的唯一方法(尽管它们也适用于通常打开的文件)。
对于编码设置为latin1以外的文件,文件中的一个字符可能由多个字节表示。参数Number始终表示从文件中读取的字符数,为什么在读取Unicode文件时文件中的位置可能比此数字移动得多。
另外,如果编码设置为latin1以外的其他值,如果数据包含大于255的字符,则read/3调用将失败,为什么读取此类文件时首选io(3)模块。
该函数返回:
{ok,Data}
如果文件以二进制模式打开,读取的字节以二进制形式返回,否则以列表形式返回。如果文件结尾已达到,列表或二进制文件将短于请求的字节数。
eof
如果Number> 0和文件结尾已达到,则返回任何可以读取的内容。
典型的错误原因:
ebadf
该文件未打开以供阅读。
{no_translation,unicode,latin1}
该文件使用另一种编码而不是latin1打开,并且文件中的数据不能转换为该函数返回的字节数据。
read_file(Filename) -> {ok, Binary} | {error, Reason}
Types:
Filename = name_all()
Binary = binary()
Reason = posix() | badarg | terminated | system_limit
返回{ok,Binary},其中Binary是包含Filename的内容的二进制数据对象,或 {error,Reason}如果发生错误。
典型的错误原因:
enoent
该文件不存在。
eacces
缺少的权限读取文件或者搜索其中一个父目录。
eisdir
指定的文件是一个目录。
enotdir
文件名的一个组件不是一个目录。在某些平台上,取而代之的是返回enoent。
enomem
文件内容没有足够的内存。
read_file_info(Filename) -> {ok, FileInfo} | {error, Reason}
read_file_info(Filename, Opts) -> {ok, FileInfo} | {error, Reason}
Types:
Filename = name_all()
Opts = [file_info_option()]
FileInfo = file_info()
Reason = posix() | badarg
检索有关文件的信息。如果成功则返回 {ok,FileInfo},否则返回 {error,Reason}。FileInfo 是一个记录 file_info,在内核包含文件file.hrl中定义 。在调用函数的模块中包含以下指令:
-include_lib("kernel/include/file.hrl").
atime,mtime和ctime中返回的时间类型 取决于Opts::{time,Type}中设置的时间类型。类型local将返回本地时间,universal将返回通用时间,posix将返回自unix time epoch(1970-01-01 00:00 UTC)之前或之后的秒数。默认是{time,local}。
注意
由于文件时间在大多数操作系统上以posix时间存储,因此使用posix选项查询文件信息会更快。
记录file_info包含以下字段。
size = integer()> = 0
文件大小(以字节为单位)
type = device | directory | other | regular | symlink
文件的类型。
access = read | write | read_write | none
当前系统访问该文件。
atime = date_time() | integer()> = 0
上次读取文件时。
mtime = date_time() | integer()> = 0
上次写入文件的时间。
ctime = date_time() | integer()> = 0
这段时间的解释取决于操作系统。在Unix上,它是最后一次更改文件或inode。在Windows中,这是创建时间。
mode = integer() >= 0
文件权限为以下位值的总和:
8#00400
读取权限:所有者
8#00200
写权限:所有者
8#00100
执行权限:所有者
8#00040
读权限:组
8#00020
写入权限:组
8#00010
执行权限:组
8#00004
读权限:其他
8#00002
写入权限:其他
8#00001
执行权限:其他
16#800
在执行时设置用户ID
16#400
执行时设置组ID
在Unix平台上,可以设置除上面列出的位之外的其他位。
links = integer()> = 0
文件链接的数量(对于没有链接概念的文件系统,这总是1)。
major_device = integer()> = 0
标识文件所在的文件系统。在Windows中,数字表示一个驱动器,如下所示:0表示A :, 1表示B :,依此类推。
minor_device = integer()> = 0
只对Unix上的字符设备有效。在所有其他情况下,该字段为零。
inode = integer()> = 0
给出inode编号。在非Unix文件系统上,此字段将为零。
uid = integer()> = 0
表示文件的所有者。非Unix文件系统将为零。
gid = integer()> = 0
给出文件所有者属于的组。对于非Unix文件系统将为零。
典型的错误原因:
eacces
缺少文件父目录之一的搜索权限。
enoent
该文件不存在。
enotdir
文件名的一个组件不是一个目录。在某些平台上,取而代之的是返回enoent。
read_line(IoDevice) -> {ok, Data} | eof | {error, Reason}
Types:
IoDevice = io_device() | atom()
Data = string() | binary()
Reason = posix()
| badarg
| terminated
| {no_translation, unicode, latin1}
从IoDevice引用的文件中读取一行字节/字符 。行被定义为由换行(LF,\n)字符分隔,但任何回车符(CR,\r)后跟换行符也被视为单个LF字符(回车被忽略)。该行返回包括LF,但不包括任何紧跟着LF的CR。此行为与io:get_line/2的行为一致。如果在没有任何LF结束最后一行的情况下到达文件末尾,则返回没有尾随LF的行。
该功能可用于以原始模式打开的文件。但是,如果未使用指定的{read_ahead,Size}选项打开文件,则在原始文件上使用它是低效的,这就是为什么在打开面向原始行读取的文本文件时强烈建议组合raw和{read_ahead,Size}。
如果编码设置为latin1以外的其他值,如果数据包含大于255的字符,则read_line/1调用将失败,为什么读取此类文件时首选io(3)模块。
该函数返回:
{ok,Data}
返回文件中的一行,包括尾随LF,但CRLF序列由单个LF替换(参见上文)。
如果文件以二进制模式打开,读取的字节以二进制形式返回,否则以列表形式返回。
eof
如果在读取任何内容之前已达到文件结尾,则返回。
{error, Reason}
发生错误。
典型的错误原因:
ebadf
该文件未打开以供阅读。
{no_translation,unicode,latin1}
该文件是使用除latin1之外的其他编码打开的,并且该文件上的数据无法转换为此函数返回的面向字节的数据。
read_link(Name) -> {ok, Filename} | {error, Reason}
Types:
 
赞 (0)
打赏
微信扫一扫
相关文章:
-
-
模块摘要 文件接口模块 描述 模块file提供了文件系统的接口。 在具有线程支持的操作系统上,可以让文件操作以其自己的线程执行,从而允许其他Erla... [阅读全文]
-
这个游戏是本人前不久刚入门编写的游戏,感觉里面代码很LOW但是对于新手来说很一般般吧~ 没有上传音乐文件了 运行效果: 上代码(HTML+JS): ... [阅读全文]
-
素材:demo.zip ... [阅读全文]
-
不知道大家小时候有没有学习过logo语言,就是操纵一只小王八,来画各种图案。博主小学微机课就学习了这个,最近发现python的turtle包就是lo... [阅读全文]
-
入门设计模式之单例 注意一下文章都伴有UML图,不了解的同学请先参考一下:这个几分钟几张图教你学会如何使用UML 入门设计模式之建造者 入门设计模式... [阅读全文]
-
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
上一篇: javascript库是什么东西
下一篇: java线程锁基础
推荐阅读
-
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
-
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
-
[翻译]CSS模块-未来的编码方式_html/css_WEB-ITnose
-
php缓存mod_file_cache 模块的设置
-
Perl 中的 PathTools 之 File::Spec 模块详解
-
[翻译]CSS模块-未来的编码方式_html/css_WEB-ITnose
-
安装MySQLdb模块遭遇"fatal error: my_config.h: No such file or directory"的处理
-
Node.js中文件操作模块File System的详细介绍
-
Node.js中文件操作模块File System的详细介绍
-
使用Python3中的gettext模块翻译Python源码以支持多语言
发表评论