`
argan
  • 浏览: 129609 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Erlang 基础学习 10 Programming with Files

阅读更多

文件操作函数库的组织方式

• file 模块,打开关闭,读写,列目录,等等基本操作
• filename 模块,一致的处理不同平台上的文件名
• filelib 模块,是file模块的一个扩充,大多是用file模块的函数编写
• io 模块,提供一些函数来处理已打开的文件,比如分析文件内容,将格式化的数据写入文件等

读取文件的不同方式

• 文件内容都是由一些字节组成,这些内容是什么含义完全取决于怎么处理
• 例如文件:
{person, "joe" , "armstrong" ,
        [{occupation, programmer},
         {favoriteLanguage, erlang}]}.
{cat, {name, "zorro" },
      {owner, "joe" }}.
• 1. 一次性读入所有的语句
• file:consult(FileName) 假设文件内包含有合法的erlang语法,成功返回{ok,[Term]},失败返回{error,Reason}
• 2. 一条一条的读出语句
1> {ok, S} = file:open("data1.dat", read).
{ok,<0.36.0>}
2> io:read(S, '').
{ok,{person,"joe",
     "armstrong",
     [{occupation,programmer},{favoriteLanguage,erlang}]}}
3> io:read(S, '').
{ok,{cat,{name,"zorro"},{owner,"joe"}}}
4> io:read(S, '').
eof
5> file:close(S)
• @spec file:open(File, read) => {ok, IoDevice} | {error, Why}
• @spec io:read(IoDevice, Prompt) => {ok, Term} | {error,Why} | eof
• @spec file:close(IoDevice) => ok | {error, Why}
• 3. 一次读入一行
• 使用io:get_line(IoDevice,Prompt) => Line|eof
• 4. 将整个文件一次性读入,得到一个二进制数据
• file:read_file(File)
• 5. 打开文件,进行随机访问
• file:open(File,[read,binary,raw]).
• file:pread(IoDevice, Start, Len),从IoDevice中读取Start开始的Len个字节,文件从1开始,如果Len大于文件字节总数,返回全部内容

写文件的方式
• 1. 格式化写入
• @spec io:format(IoDevice, Format, Args) -> ok
• Format 写入的格式,例如
• ~n,~p,~w,~s
• 对于~s(格式化字符串),可以有更复杂的格式,例如
Format                             Result
io:format("|~10s|~n", ["abc"])       |        abc|
io:format("|~-10s|~n", ["abc"])      |abc       |
io:format("|~10.3.+s|~n",["abc"])   |+++++++abc|
io:format("|~10.10.+s|~n",["abc"]) |abc+++++++|
io:format("|~10.7.+s|~n",["abc"])   |+++abc++++|

• 2. 一次性写入整个文件
• file:write_file(File, IO)
• 3. 随机写入,注意,是覆盖原来的内容
1> {ok, S} = file:open("...", [raw,write,binary])
{ok, ...}
2> file:pwrite(S, 10, <<"new">>)
ok
3> file:close(S)
ok

目录操作
• file:list_dir(Dir).
• file:make_dir(Dir).
• file:delete_dir(Dir).删除非空目录

文件操作

• file:copy(File,Dest).
• file:delete(File).


读取文件信息
• file:read_file_info(File).
-record(file_info,
        {size   :: non_neg_integer(),   % Size of file in bytes.
         type   :: 'device' | 'directory' | 'other' | 'regular' | 'symlink',
         access :: 'read' | 'write' | 'read_write' | 'none',
         atime  :: date_time(), % The local time the file was last read:
                                % {{Year, Mon, Day}, {Hour, Min, Sec}}.
         mtime  :: date_time(), % The local time the file was last written.
         ctime  :: date_time(), % The interpretation of this time field
                                % is dependent on operating system.
                                % On Unix it is the last time the file or
                                % or the inode was changed.  On Windows,
                                % it is the creation time.
         mode   :: integer(),           % File permissions.  On Windows,
                                        % the owner permissions will be
                                        % duplicated for group and user.
         links  :: non_neg_integer(),   % Number of links to the file (1 if the
                                        % filesystem doesn't support links).
         major_device :: integer(),     % Identifies the file system (Unix),
                                        % or the drive number (A: = 0, B: = 1)
                                        % (Windows).
         %% The following are Unix specific.
         %% They are set to zero on other operating systems.
         minor_device,                  % Only valid for devices.
         inode  :: integer(),           % Inode number for file.
         uid    :: integer(),           % User id for owner (integer).
         gid    :: integer()}).         % Group id for owner (integer).

一个文件查找的例子
-module(lib_find).
-export([files/3, files/5]).
-import(lists, [reverse/1]).
-include_lib("kernel/include/file.hrl" ).

%% Dir 要查找的目录
%% Re  正则表达式,例如*.mp3
%% Flag 是否要递归
files(Dir, Re, Flag) ->
    Re1 = regexp:sh_to_awk(Re),
    reverse(files(Dir, Re1, Flag, fun(File, Acc) ->[File|Acc] end, [])).

files(Dir, Reg, Recursive, Fun, Acc) ->
    case file:list_dir(Dir) of
        {ok, Files} -> find_files(Files, Dir, Reg, Recursive, Fun, Acc);
        {error, _} -> Acc
    end.

find_files([File|T], Dir, Reg, Recursive, Fun, Acc0) ->
    FullName = filename:join([Dir,File]),
    case file_type(FullName) of
        regular ->
             case regexp:match(FullName, Reg) of
                  {match, _, _} ->
                      Acc = Fun(FullName, Acc0),
                      find_files(T, Dir, Reg, Recursive, Fun, Acc);
                  _ ->
                      find_files(T, Dir, Reg, Recursive, Fun, Acc0)
             end;
        directory ->
             case Recursive of
                  true ->
                      Acc1 = files(FullName, Reg, Recursive, Fun, Acc0),
                      find_files(T, Dir, Reg, Recursive, Fun, Acc1);
                  false ->
                      find_files(T, Dir, Reg, Recursive, Fun, Acc0)
             end;
        error ->
            find_files(T, Dir, Reg, Recursive, Fun, Acc0)
    end;
find_files([], _, _, _, _, A) ->
    A.
file_type(File) ->
    case file:read_file_info(File) of
        {ok, Facts} ->
             case Facts#file_info.type of
                  regular   -> regular;
                  directory -> directory;
                  _         -> error
             end;
        _ ->
            error
    end.

分享到:
评论

相关推荐

    erlang programming

    通过对以上知识点的学习和实践,开发者可以利用Erlang的强大功能来创建高可靠性、高并发的分布式系统。 erlang-book-part1.pdf可能涵盖其中的一些或全部内容,为读者提供全面的Erlang编程指导。

    Erlang Programming 导读.pdf

    ### Erlang Programming 导读.pdf 知识点详解 #### 一、Erlang简介与特点 **Erlang**是一种通用的、并发性强的、容错性高的编程语言,适用于构建分布式系统的软件。它最初由爱立信公司开发,用于解决电信系统中的...

    Programming Erlang.pdf

    从目录可以看出,本书首先介绍了Erlang的基础概念和安装指南,随后逐步深入到更高级的主题和技术细节。通过这种方式,读者可以从零开始学习Erlang,并逐步掌握其核心功能和编程技巧。 ### 7. 特别准备 文件中多次...

    《Programming Erlang》

    通过阅读《Programming Erlang》,读者可以深入了解这些特性,并学习如何运用它们来解决实际问题。书中的例子涵盖了从基本的函数式编程概念到复杂的并发系统设计,对于任何想要涉足Erlang或对函数式编程感兴趣的人来...

    erlang学习相关资料

    Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.

    Erlang编程语言The Erlang Programming Language

    这是《 Erlang编程语言》的上一页,我们正在处理中,将那里的所有书籍都转换为新页面。 请再次检查此页面!!!

    Pragmatic.Programming.Erlang.2nd.Edition

    ### 关于《Pragmatic Programming ...总之,《Pragmatic Programming Erlang 第二版》是一本非常值得推荐的Erlang学习资料,无论你是刚刚接触Erlang的新手还是想要深入了解Erlang的资深开发者,都能从中获益良多。

    programming erlang src code

    《编程Erlang》是Joe ...通过对《编程Erlang》源码的学习,我们可以深入了解Erlang的精髓,掌握如何构建高效、健壮的并发系统,以及如何利用其特性解决实际问题。源码阅读不仅是理论知识的深化,更是实践技能的提升。

    Erlang语音学习资料汇总

    资源名称:Erlang语音学习资料汇总资源目录:【】Erlang程序设计【】[ManningPublications]ErlangandOTPinAction【】[NoStarchPress]LearnYouSomeErlangforGreatGood!ABeginner'sGuide【】[O'ReillyMedia]...

    erlang学习资料

    理解函数式编程的核心概念,如不可变数据、高阶函数和模式匹配,是学习Erlang的基础。 2. **过程与并发**:Erlang中的并发是通过轻量级进程(Lightweight Processes, LWP)实现的,每个进程有自己的堆栈和消息队列...

    erlang中文基础教程

    "Erlang中文基础教程" Erlang 编程语言是一种功能强大且灵活的编程语言,它提供了一个交互式的 shell 环境,允许用户在其中编写和运行代码。 Erlang Shell 是一个命令行交互环境,类似于 UNIX 和 LINUX 系统的...

    Concurrent Programming in ERLANG (P1-90)

    在开始学习并发之前,理解Erlang中的顺序编程是非常重要的基础。这部分介绍了基本的编程概念,如变量、数据类型、流程控制等。例如,在Erlang中,所有变量都是只读的,这意味着一旦一个变量被赋值后就不能改变其值,...

    Programming Erlang

    总的来说,《Programming Erlang》是一本全面且深入的教程,对于想要学习或深入了解Erlang编程语言的读者来说,是不可或缺的参考资料。通过阅读本书,你不仅可以掌握Erlang的基本语法,还能了解到如何利用其特性来...

    Introducing Erlang Getting Started in Functional Programming(2nd) epub

    Introducing Erlang Getting Started in Functional Programming(2nd) 英文epub 第2版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    erlang 连接学习例子

    在这个“erlang 连接学习例子”中,我们有两个核心文件:`server.erl` 和 `client.erl`,它们分别代表了一个服务器进程和客户端进程,展示了Erlang中进程间的通信机制。 `server.erl` 文件通常包含一个持续运行的...

Global site tag (gtag.js) - Google Analytics