- 浏览: 129609 次
- 性别:
- 来自: 杭州
最新评论
-
zhi_nan_7:
做一个软件,需求是这样的:银行软件,需要对(excel)表格 ...
如何应对表结构经常变化? -
GuolinLee:
{A, _int, [B|_int], {B}} = {abc ...
erlang 中带下划线变量的使用 -
mozhenghua:
兄弟有没有啥解决方案呀?
MVC中被忽略的View层 -
ccchenzhong:
仁兄,还有哪边有你的这篇文章可看。如果有,可以给我个链接?或是 ...
javarebel 原理分析--说明 -
lingqi1818:
一晃一年过去了。。。
回顾2010,展望2011
文件操作函数库的组织方式
• 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.
发表评论
-
读了一下hotwheels的代码
2009-08-31 11:56 2561上次提到的一个挑战, ... -
不错的erlang tutorial
2009-08-19 09:41 1213http://learnyousomeerlang.com/ ... -
erlang 新书 "OTP and Erlang in Action"
2009-08-17 17:40 1374一本新书,似乎还未完成,见 http://pokingarou ... -
erlang.org似乎挂了
2009-08-17 11:38 1230从昨天起,erlang.org就无法访问了,ping能ping ... -
为啥我的erlide超慢无比?
2009-08-06 16:08 1378为啥我的erlide超慢无比? 刚下载的一个eclip ... -
erlang 程序性能优化挑战
2009-07-20 12:03 1965OpenPoker 的作者Joel Reymont 发起的 ... -
erlang programming 比programming erlang这本书好
2009-07-15 16:38 1913这两本书我都是看英文pdf的,看了TheBook之后,没啥感觉 ... -
erlang中的message发送的几个事实
2009-07-13 17:59 1836这个世界是并行的,我们每个人都有自己的思想,你没法知道我想什么 ... -
在ubuntu上编译erlang with wx
2009-07-12 09:10 1968因为ubuntu维护的erlang版本太旧,因此从某时开始,我 ... -
并不是所有的时候都应该选择尾递归
2009-07-08 17:06 1013要实现一个函数,参数是一个list,结果是将list里每个数字 ... -
erlang 中case语句的使用
2009-07-07 13:16 5953在erlang中,至少有三种可互换的流程控制方式:函数声明上的 ... -
erlang 中带下划线变量的使用
2009-07-03 15:39 3623在erlang里'_'是一个特殊的变量(其实erlang里不应 ... -
Erlang 基础学习 1
2008-09-16 02:55 1023Erlang Day 1 基础• 容错,在多核CPU上性能好, ... -
Erlang 基础学习 2 简单的程序
2008-09-16 07:49 1075Erlang Sequential ProgrammingMo ... -
Erlang 基础学习 3 异常处理
2008-09-17 08:09 1405Erlang Day 3 异常处理• 三种方式可以抛出异常• ... -
Erlang 基础学习 4 Advanced Sequential Programming
2008-09-17 08:11 1513Day 4 Advanced Sequential Progr ... -
Erlang 基础学习 5 编译和运行
2008-09-17 09:40 1819如何退出erlang 的shell• ... -
Erlang 基础学习 6 Concurrent Programming
2008-09-18 06:14 1325好戏开始了Erlang 的程序由很多process组成,这些p ... -
Erlang 基础学习 7 Errors in Concurrent Programs
2008-09-19 03:48 1911Linking Processes• 进程可以调用link(P ... -
Erlang 基础学习 8 Distributed programming
2008-09-25 06:22 1496Distributed Programming为啥需要分布式的 ...
相关推荐
通过对以上知识点的学习和实践,开发者可以利用Erlang的强大功能来创建高可靠性、高并发的分布式系统。 erlang-book-part1.pdf可能涵盖其中的一些或全部内容,为读者提供全面的Erlang编程指导。
### Erlang Programming 导读.pdf 知识点详解 #### 一、Erlang简介与特点 **Erlang**是一种通用的、并发性强的、容错性高的编程语言,适用于构建分布式系统的软件。它最初由爱立信公司开发,用于解决电信系统中的...
从目录可以看出,本书首先介绍了Erlang的基础概念和安装指南,随后逐步深入到更高级的主题和技术细节。通过这种方式,读者可以从零开始学习Erlang,并逐步掌握其核心功能和编程技巧。 ### 7. 特别准备 文件中多次...
通过阅读《Programming Erlang》,读者可以深入了解这些特性,并学习如何运用它们来解决实际问题。书中的例子涵盖了从基本的函数式编程概念到复杂的并发系统设计,对于任何想要涉足Erlang或对函数式编程感兴趣的人来...
Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.
这是《 Erlang编程语言》的上一页,我们正在处理中,将那里的所有书籍都转换为新页面。 请再次检查此页面!!!
### 关于《Pragmatic Programming ...总之,《Pragmatic Programming Erlang 第二版》是一本非常值得推荐的Erlang学习资料,无论你是刚刚接触Erlang的新手还是想要深入了解Erlang的资深开发者,都能从中获益良多。
《编程Erlang》是Joe ...通过对《编程Erlang》源码的学习,我们可以深入了解Erlang的精髓,掌握如何构建高效、健壮的并发系统,以及如何利用其特性解决实际问题。源码阅读不仅是理论知识的深化,更是实践技能的提升。
资源名称:Erlang语音学习资料汇总资源目录:【】Erlang程序设计【】[ManningPublications]ErlangandOTPinAction【】[NoStarchPress]LearnYouSomeErlangforGreatGood!ABeginner'sGuide【】[O'ReillyMedia]...
理解函数式编程的核心概念,如不可变数据、高阶函数和模式匹配,是学习Erlang的基础。 2. **过程与并发**:Erlang中的并发是通过轻量级进程(Lightweight Processes, LWP)实现的,每个进程有自己的堆栈和消息队列...
"Erlang中文基础教程" Erlang 编程语言是一种功能强大且灵活的编程语言,它提供了一个交互式的 shell 环境,允许用户在其中编写和运行代码。 Erlang Shell 是一个命令行交互环境,类似于 UNIX 和 LINUX 系统的...
在开始学习并发之前,理解Erlang中的顺序编程是非常重要的基础。这部分介绍了基本的编程概念,如变量、数据类型、流程控制等。例如,在Erlang中,所有变量都是只读的,这意味着一旦一个变量被赋值后就不能改变其值,...
总的来说,《Programming Erlang》是一本全面且深入的教程,对于想要学习或深入了解Erlang编程语言的读者来说,是不可或缺的参考资料。通过阅读本书,你不仅可以掌握Erlang的基本语法,还能了解到如何利用其特性来...
Introducing Erlang Getting Started in Functional Programming(2nd) 英文epub 第2版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
在这个“erlang 连接学习例子”中,我们有两个核心文件:`server.erl` 和 `client.erl`,它们分别代表了一个服务器进程和客户端进程,展示了Erlang中进程间的通信机制。 `server.erl` 文件通常包含一个持续运行的...