使用路径
程序不应该依赖于奇葩的系统,这样你的代码会难以阅读和移植。最糟糕的是硬编码的路径,
windows和Unix的路径分隔符正好相反。最好使用path.join,它可以帮助你解决这个问题。
pl.path提供了与Python中os.path里相同的功能。
> p = 'c:\\bonzo\\DOG.txt'
> = path.normcase (p) ---> only makes sense on Windows
c:\bonzo\dog.txt
> = path.splitext (p)
c:\bonzo\DOG .txt
> = path.extension (p)
.txt
> = path.basename (p)
DOG.txt
> = path.exists(p)
false
> = path.join ('fred','alice.txt')
fred\alice.txt
> = path.exists 'pretty.lua'
true
> = path.getsize 'pretty.lua'
2125
> = path.isfile 'pretty.lua'
true
> = path.isdir 'pretty.lua'
false
path.expanduser提供你所在系统的用户目录。
windows
> = path.expanduser '~/mydata.txt'
'C:\Documents and Settings\SJDonova/mydata.txt'
Unix
> = path.expanduser '~/mydata.txt'
/home/sdonovan/mydata.txt
在windows下,os.tmpname返回一个指向系统根目录中的临时文件。(通常,你无权访问根文件夹)
path.tmpname更正了这个问题,它使用TMP环境变量。
> os.tmpname() -- not a good place to put temporary files!
'\s25g.'
> path.tmpname()
'C:\DOCUME~1\SJDonova\LOCALS~1\Temp\s25g.1'
另外一个有用的函数是pl.path.package_path,可以告诉你lua模块的路径。在我的系统上,
package_path(‘pl.path’)返回C:\Program Files\Lua\5.1\lualibs\pl\path.lua’,
package_path(‘ifs’)则返回‘C:\Program Files\Lua\5.1\clibs\lfs.dll’。pl.path.package_path
使用package.searchpath实现,这个函数是lua 5.2里新增的,在lua 5.1里则由penlight提供。
文件操作
pl.file是一个新的模块,它提供了命名更友好的函数。例如file.read和file.write分别是utils.readfile和
utils.writefile的别名。
小的文件可以快速地读入,并只用一次操作。file.read接受传入的文件名,如果成功,以字符串返回
文件内容;否则返回nil和错误信息。如果你想以二进制读文件,还有一个可选的布尔参数(这在Unix
上相同,但对windos很重要)
在上一版的Penlight里,如果没有指定文件utils.readfile将会使用标准输入,但是这可能会引起讨厌的
bug。使用io.read '*a'可以提取标准输入。
类似地,file.write第一个参数为文件名,第二个参数为写入内容。
例如,转换文件内容到大写
require 'pl'
assert(#arg == 2, 'supply two filenames')
text = assert(file.read(arg[1]))
assert(file.write(arg[2],text:upper()))
复制文件尤其棘手。file.copy和file.move尝试去最好地实现。在Windows上它们使用系统CopyFile和
MoveFile函数,但是要求安装alien包(对于lua for windows,已经安装)。否则,调用系统复制命令。
如果写windows下的gui程序,则会出现一闪而过的cmd黑窗口。
目录操作
pl.dir提供了一些有用的函数来操作目录。fnmatch可以用来匹配符合要求的文件。getdirectories可以获取
目录下的所有子目录,getfiles则获取符合要求的文件。这些函数返回表,而不是像lfs.dir返回迭代器。
dir.makepath可以创建全路径,当然包括子目录。rmtree提供了强力的删除操作,可以删除目录下的所有文件
和子目录(类似Python里的shutils)
> = dir.makepath 't\\temp\\bonzo'
> = path.isdir 't\\temp\\bonzo'
true
> = dir.rmtree 't'
dir.rmtree依赖dir.walk,它提供了一个强力的扫描目录树工具。这里是它的实现:
--- remove a whole directory tree.
-- @param path A directory path
function dir.rmtree(fullpath)
for root,dirs,files in dir.walk(fullpath) do
for i,f in ipairs(files) do
os.remove(path.join(root,f))
end
lfs.rmdir(root)
end
end
dir.clonetree 可以复制目录树。第一个参数是路径,要求必须存在,第二个参数是要复制到的位置(注意,第二个
参数不能是第一个参数的子目录,否则发狂)。默认只会创建目录结构,你可以提供提供一个函数复制找到的所有
文件。
-- make a copy of my libs folder
require 'pl'
p1 = [[d:\dev\lua\libs]]
p2 = [[D:\dev\lua\libs\..\tests]]
dir.clonetree(p1,p2,dir.copyfile)
一个更复制的版本,用来复制被修改过的文件。
-- p1 and p2 as before, or from arg[1] and arg[2]
dir.clonetree(p1,p2,function(f1,f2)
local res
local t1,t2 = path.getmtime(f1),path.getmtime(f2)
-- f2 might not exist, so be careful about t2
if not t2 or t1 > t2 then
res = dir.copyfile(f1,f2)
end
return res -- indicates successful operation
end)
dir.clonetree使用path.common_prefix。如上面定义的p1和p2,共同的路径是‘d:\dev\lua’,
‘d:\dev\lua\libs\testfunc.lua’被复制到‘d:\dev\lua\test\testfunc.lua’,等。
如果你要查找文件列表里共同的路径,可以用tablex.reduce来完成。
- lua工具库penlight--01简介
lua的设计目标是嵌入式语言,所以和其它动态语言(如python.ruby)相比其自带的库缺少很多实用功能. 好在有lua社区有Penlight,为lua提供了许多强大的功能,接下来的几篇博客,我会简 ...
- lua工具库penlight--06数据(二)
词法扫描 虽然 Lua 的字符串模式匹配是非常强大,但需要更强大的东西.pl.lexer.scan可以提供标记字符串,按标记机分类数字.字符串等. > lua -lpl Lua 5.1.4 C ...
- lua工具库penlight--09技术选择
模块化和粒度 在理想的世界,一个程序应该只加载它需要的库.Penlight需要额外100 Kb 的字节码来工作.它是简单但却乏味要加载你需要什么: local data = require 'pl.d ...
- lua工具库penlight--08额外的库(一)
额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时 ...
- lua工具库penlight--07函数编程(二)
列表压缩 列表压缩是以紧凑的方式通过指定的元素创建表.在 Python里,你可以说: ls = [x for x in range(5)] # == [0,1,2,3,4] 在 Lua,使用pl.c ...
- lua工具库penlight--02表和数组
类Python的List lua的优美之处在于把数组和关联数组都用table实现了(Python中叫list和dict,C++中叫vector和map). 一般我们把数字索引的table叫做list. ...
- lua工具库penlight--07函数编程(一)
函数编程 序列 Lua 迭代器 (最简单的形式) 是一个函数,可以多次调用返回一个或多个值.for in语句理解迭代器和循环,直到该函数将返回nil. Lua有标准的序列迭代器 (ipairs和pai ...
- lua工具库penlight--06数据(一)
这篇太长了,分了两部分.(这个是机器翻译之后我又校对了一下,以后的都这样,人工翻译太累了.) 读数据文件 首先考虑清楚,你的确需要一个自定义的文件读入器吗?如果是,你能确定有能力写好吗? 正确,稳健, ...
- lua工具库penlight--05日期和时间
创建和显示时间 Date类提过了简洁的使用date和time的方法.它依赖于os.date和os.time. Date对象可以通过table创建,如果os.date,同时提过了获取和设置date 成员 ...
随机推荐
- Node.js:get/post请求、全局对象、工具模块
一.GET/POST请求 在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交.表单提交到服务器一般都使用 GET/POST 请求. 1.获取GET请求内容 由于GET请求直接被嵌入在路径 ...
- mysql 索引长度的限制
myisam表,单列索引,最大长度不能超过 1000 bytes: innodb表,单列索引,最大长度不能超过 767 bytes: utf8 编码时 一个字符占三个字节 varchar 型能建 ...
- Framework元数据向导错误之BMT-MD-6001与BMT-IMP-0002
1:错误BMT-MD-6001的两种处理方法 在Framework中创建Project后,运行元数据向导从数据库连接中向物理层导入数据表,报错如下 环境如下:Framework版本:10.2.0,Co ...
- android中listview点击事件失效的灵异事件
首先说明一下我想实现的功能: 点击某个item之后,让其颜色发生变化.如果变化网上有很多例子,我就不班门弄斧了.Listview之所以点击没有反应是因为上图中绿色部分(自己定义的一个继承BaseAda ...
- java通过反射调用不同参数的方法
import java.lang.reflect.Method; public class testReflect { /** * @param args */ public static void ...
- MySQL主从架构之Master-Slave主从同步
MySQL复制 MySQL复制是指将主库上的DDL和DML操作通过二进制日志传到从库上,使主库和从库上的数据保持同步 复制原理: 主服务器将更新写入二进制日志文件,并维护文件的一个索引来跟踪日志循环. ...
- ionic 滚动条问题
方案一: 设置 ion-content ---> overflow-scroll="false"
- 安卓手机GPU OpenCL总结(转)
前段时间,把市面上手机GPU OpenCL支持情况做了一个总结.总结如下: 目前,手机 GPU 市面有四个公司产品:Qualcomm, Imagination Technologies,ARM, Vi ...
- Maven--要点笔记
--maven笔记 1.maven命令 2.archetype插件:用于创建符合maven规定的文件夹骨架 命令: mvn archetype:generate 3. 坐标:构件 仓库: 本地仓库 ...
- 【APP接口开发】常用HTTP响应头状态码详解
1.200 OK,客户端请求城成功 2.400 Bad Request ,客服端请求语法错误,服务器无法理解和处理 3.401 unauthorized,请求未通过认证 4.403 permissio ...