- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Ruby中操作文件的方法介绍由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Ruby提供了一套完整的I/O相关的内核模块中实现方法。所有I/O方法来自IO类.
类IO提供了所有的基本方法,如 read, write, gets, puts, readline, getc 和 printf. 。
本章将涵盖所有可供在Ruby中使用的基本I/O功能。如需使用更多的功能,请参考Ruby的IO类。 puts 语句
在前面的章节中,你指定值的变量和然后使用声明 puts 输出.
puts 把语句指示程序显示存储在变量值。这将添加一个新行,每行末尾写出(输出)。 例子
1
2
3
4
5
6
|
#!/usr/bin/ruby
val1 =
"This is variable one"
val2 =
"This is variable two"
puts val1
puts val2
|
这将产生以下结果:
1
2
|
This is variable one
This is variable two
|
gets 语句
gets 语句可以用来从用户从标准屏幕采取输入调用 STDIN. 例如:
下面的代码显示了如何使用 gets 语句。此代码将提示用户输入一个值,将被存储在一个变量val,最后将打印在 STDOUT. 。
1
2
3
4
5
|
#!/usr/bin/ruby
puts
"Enter a value :"
val = gets
puts val
|
这将产生以下结果:
1
2
3
|
Enter a value :
This is entered value
This is entered value
|
putc 语句
与 puts 语句不相同,它在屏幕上输出整个字符串,而putc 语句可以用来一次输出一个字符。 实例
下面的代码的输出只是一个字符 H
1
2
3
4
|
#!/usr/bin/ruby
str=
"Hello Ruby!"
putc str
|
这将产生以下结果:
1
|
H
|
print 语句
print 语句是类似 puts 语句。唯一的区别是,puts语句后进入到下一行打印的内容,print 语句将光标定位在同一行上。 实例
1
2
3
4
|
#!/usr/bin/ruby
print
"Hello World"
print
"Good Morning"
|
这将产生以下结果:
1
|
Hello WorldGood Morning
|
打开和关闭文件:
到现在为止,我们已经可以读取和写入的标准输入和输出。我们将看看如何运用到实际的数据文件。 File.new 方法
可以创建一个的File对象使用File.new方法的读,写或两者兼有,这需要根据模式串。最后,可以使用File.close的方法来关闭该文件。 语法:
1
2
3
|
aFile =
File
.
new
(
"filename"
,
"mode"
)
# ... process the file
aFile.close
|
File.open 方法
可以使用File.open方法的方法来创建一个新的文件对象,并分配到一个文件中,文件对象。然而,File.open方法和File.new方法之间区别。 File.open方法不同的是,可以关联一个块,而不能在File.new方法使用.
1
2
3
|
File
.open(
"filename"
,
"mode"
)
do
|aFile|
# ... process the file
end
|
这里是一个不同的模式打开文件列表:
读取和写入文件:
同样的方法,我们一直在使用“简单”的I/O所有文件对象。因此,gets 从标准输入读取一行,File.gets文件从文件对象读取一行.
然而,I/O对象提供额外的访问方法,使我们的生活更轻松。 sysread 方法
可以使用该方法sysread读取一个文件的内容。可以打开该文件时,在任何模式中使用的方法sysread。例如:
以下是输入文本文件:
1
|
This is a simple text file
for
testing purpose.
|
现在,让我们尝试读取这个文件:
1
2
3
4
5
6
7
8
9
|
#!/usr/bin/ruby
aFile =
File
.
new
(
"input.txt"
,
"r"
)
if
aFile
content = aFile.sysread(
20
)
puts content
else
puts
"Unable to open file!"
end
|
这条语句将输出文件的前20个字符。现在,将文件指针放置在第21个字符。 syswrite 方法
可以使用方法 syswrite 中的内容写入到一个文件中。需要打开该文件在写入模式使用方法 syswrite 时。 例如:
1
2
3
4
5
6
7
8
|
#!/usr/bin/ruby
aFile =
File
.
new
(
"input.txt"
,
"r+"
)
if
aFile
aFile.syswrite(
"ABCDEF"
)
else
puts
"Unable to open file!"
end
|
这条语句将 “ABCDEF” 写入到文件中。 each_byte 方法
这种方法属于类 File 。总是关联一个块方法each_byte。考虑下面的代码示例:
1
2
3
4
5
6
7
8
9
|
#!/usr/bin/ruby
aFile =
File
.
new
(
"input.txt"
,
"r+"
)
if
aFile
aFile.syswrite(
"ABCDEF"
)
aFile.each_byte {|ch| putc ch; putc ?. }
else
puts
"Unable to open file!"
end
|
一个接一个字符传递变量ch,然后在屏幕上显示如下:
1
2
3
|
s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
.
.
|
IO.readlines 方法
类File 是 IO类的一个子类。类的IO也有一些方法可用于对文件进行操作.
IO类的方法之一是IO.readlines。此方法返回的内容文件行。下面的代码显示使用方法IO.readlines:
1
2
3
4
5
|
#!/usr/bin/ruby
arr =
IO
.readlines(
"input.txt"
)
puts arr[
0
]
puts arr[
1
]
|
在这段代码中,变量arr是一个数组。将文件 input.txt 的每一行,将数组arr中的元素。因此arr[0]将包含在第一行,而到达[1]将包含该文件的第二行。 IO.foreach 方法
此方法还返回一行一行的输出。foreach和 readlines 方法之间的差异是 foreach方法可以带有块相关联,foreach不会返回一个数组。例如:
1
2
3
|
#!/usr/bin/ruby
IO
.foreach(
"input.txt"
){|block| puts block}
|
此代码将传递该文件的内容,测试可变块的行,然后,输出将被显示在屏幕上。 重命名和删除文件:
可以重命名和删除文件用Ruby以编程方式使用 rename 和 delete 方法.
下面的例子,重命名现有文件 test1.txt
1
2
3
4
|
#!/usr/bin/ruby
# Rename a file from test1.txt to test2.txt
File
.rename(
"test1.txt"
,
"test2.txt"
)
|
下面的例子删除现有文件 test2.txt
1
2
3
4
|
#!/usr/bin/ruby
# Delete file test2.txt
File
.delete(
"text2.txt"
)
|
文件模式和所有权:
使用chmod掩码的方法来改变模式或权限/访问的文件列表:
下面的例子改变现有的文件test.txt模式掩码值:
1
2
3
4
|
#!/usr/bin/ruby
file =
File
.
new
(
"test.txt"
,
"w"
)
file.chmod(
0755
)
|
以下的表可以帮助选择不同的面具为chmod方法:
文件查询:
下面的命令测试一个文件是否存在,然后再打开它:
1
2
3
|
#!/usr/bin/ruby
File
.open(
"file.rb"
)
if
File
:
:exists
?(
"file.rb"
)
|
下面的命令查询文件是否是真是个文件:
1
2
3
4
|
#!/usr/bin/ruby
# This returns either true or false
File
.file?(
"text.txt"
)
|
给定文件名是否为一个目录,下面的命令查找:
1
2
3
4
5
6
7
|
#!/usr/bin/ruby
# a directory
File
:
:directory
?(
"/usr/local/bin"
)
# => true
# a file
File
:
:directory
?(
"file.rb"
)
# => false
|
下面的命令查找该文件是否可读,可写或可执行文件:
1
2
3
4
5
|
#!/usr/bin/ruby
File
.readable?(
"test.txt"
)
# => true
File
.writable?(
"test.txt"
)
# => true
File
.executable?(
"test.txt"
)
# => false
|
下面的命令查找该文件是否有大小为零或不:
1
2
3
|
#!/usr/bin/ruby
File
.zero?(
"test.txt"
)
# => true
|
下面的命令返回的文件大小:
1
2
3
|
#!/usr/bin/ruby
File
.size?(
"text.txt"
)
# => 1002
|
可以使用下面的命令找出一种类型的文件:
1
2
3
|
#!/usr/bin/ruby
File
:
:ftype
(
"test.txt"
)
# => file
|
ftype 方法识别的文件类型返回下列之一: file, directory, characterSpecial, blockSpecial, fifo, link, socket 或 unknown. 。
下面的命令可以用来发现当一个文件被创建,修改或上次访问:
1
2
3
4
5
|
#!/usr/bin/ruby
File
:
:ctime
(
"test.txt"
)
# => Fri May 09 10:06:37 -0700 2008
File
:
:mtime
(
"text.txt"
)
# => Fri May 09 10:44:44 -0700 2008
File
:
:atime
(
"text.txt"
)
# => Fri May 09 10:45:01 -0700 2008
|
Ruby中的目录:
所有文件都包含在不同的目录,Ruby也没有处理这些问题。鉴于文件中类处理文件,使用目录处理Dir类。 通过目录导航:
要改变一个Ruby程序的目录内,可使用Dir.chdir如下。这个例子改变当前目录 /usr/bin. 。
1
|
Dir
.chdir(
"/usr/bin"
)
|
可以使用 Dir.pwd 找出当前目录是什么:
1
|
puts
Dir
.pwd
# This will return something like /usr/bin
|
得到一个使用一个特定的目录内的文件和目录列表,使用 Dir.entries
1
|
puts
Dir
.entries(
"/usr/bin"
).join(
' '
)
|
Dir.entries 返回一个数组的指定目录内的所有项目。Dir.foreach 提供了相同的功能:
1
2
3
|
Dir
.foreach(
"/usr/bin"
)
do
|entry|
puts entry
end
|
更简捷的方法获取目录列表利用 Dir 类数组的方法:
1
|
Dir
[
"/usr/bin/*"
]
|
创建一个目录:
可以用 Dir.mkdir,来创建目录:
1
|
Dir
.mkdir(
"mynewdir"
)
|
还可以设置一个新的目录权限(不是一个已经存在的)用mkdir:
注: 掩码755设置权限所有者,组表示 [所有人] 类似于 rwxr-xr-x , r = read, w = write, and x = execute. 。
1
|
Dir
.mkdir(
"mynewdir"
,
755
)
|
删除目录:
可用 Dir.delete 删除一个目录。Dir.unlink 和 Dir.rmdir 执行完全相同的功能,并提供了方便.
Dir.delete("testdir") 。
创建文件和临时目录:
临时文件是程序的执行过程中可能会产生短暂的,但不是永久存储的信息.
Dir.tmpdir 提供对当前系统的临时目录的路径,尽管该方法是默认不可用。为了使 Dir.tmpdir 必要使用需要 'tmpdir'. 。
可以使用 Dir.tmpdir 及 File.join,创建一个独立于平台的临时文件:
1
2
3
4
5
6
|
require
'tmpdir'
tempfilename =
File
.join(
Dir
.tmpdir,
"tingtong"
)
tempfile =
File
.
new
(tempfilename,
"w"
)
tempfile.puts
"This is a temporary file"
tempfile.close
File
.delete(tempfilename)
|
此代码创建一个临时文件,写入数据,并删除它。 Ruby的标准库还包括一个程式库Tempfile ,它可以创建临时文件:
1
2
3
4
5
|
require
'tempfile'
f = Tempfile.
new
(
'tingtong'
)
f.puts
"Hello"
puts f.path
f.close
|
内置功能:
这里是Ruby的支持功能,处理文件和目录的完整列表:
最后此篇关于Ruby中操作文件的方法介绍的文章就讲到这里了,如果你想了解更多关于Ruby中操作文件的方法介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
以下是一个非常简单的ruby服务器。 require 'socket' local_socket = Socket.new(:INET, :STREAM) local_addr = Socket.
我正在使用 OS X(使用 bash),并且是 unix 的新手。我想知道是否可以修改一些文件以便运行 ruby 程序,我不需要“ruby file.rb”,而是可以运行“ruby.rb”。 有理
我在用 Ruby 替换字符串时遇到一些问题。 我的原文:人之所为不如兽之所为。 我想替换为:==What== human does is not like ==what== animal does.
我想在一个循环中从 Ruby 脚本做这样的事情: 写一个文件a.rb(每次迭代都会改变) 执行系统(ruby 'a.rb') a.rb 将带有结果的字符串写入文件“results” a.rb 完成并且
我的问题是尝试创建一个本地服务器,以便我可以理解由我的新团队开发的应用程序。我的问题是我使用的是 Ruby 2.3.3,而 Gemfile 需要 2.3.1。我无法编辑 Gemfile,因为我被告知很
我有一个使用 GLI 框架用 Ruby 编写的命令行实用程序。我想在我的主目录中配置我的命令行实用程序,使用 Ruby 本身作为 DSL 来处理它(类似于 Gemfile 或 Rakefile)。 我
我的 Rails 应用 Controller 中有这段代码: def delete object = model.datamapper_class.first(:sourced_id =>
我正在寻找的解析器应该: 对 Ruby 解析友好, 规则设计优雅, 产生用户友好的解析错误, 用户文档的数量应该比计算器示例多, UPD:允许在编写语法时省略可选的空格。 快速解析不是一个重要的特性。
我刚开始使用 Ruby,听说有一种“Ruby 方式”编码。除了 Ruby on Rails 之外,还有哪些项目适合学习并被认可且设计良好? 最佳答案 Prawn被明确地创建为不仅是一个该死的好 PDF
我知道之前有人问过类似的问题,但是我该如何构建一个无需在前面输入“ruby”就可以在终端中运行的 Ruby 文件呢? 这里的最终目标是创建一个命令行工具包类型的东西。现在,为了执行我希望用户能够执行的
例如哈希a是{:name=>'mike',:age=>27,:gender=>'male'}哈希 b 是 {:name=>'mike'} 我想知道是否有更好的方法来判断 b 哈希是否在 a 哈希内,而
我是一名决定学习 Ruby 和 Ruby on Rails 的 ASP.NET MVC 开发人员。我已经有所了解并在 RoR 上创建了一个网站。在 ASP.NET MVC 上开发,我一直使用三层架构:
最近我看到 Gary Bernhardt 展示了他用来在 vim 中执行 Ruby 代码的 vim 快捷方式。捷径是 :map ,t :w\|:!ruby %. 似乎这个方法总是执行系统 Rub
在为 this question about Blue Ruby 选择的答案中,查克说: All of the current Ruby implementations are compiled to
我有一个 Ruby 数组 > list = Request.find_all_by_artist("Metallica").map(&:song) => ["Nothing else Matters"
我在四舍五入时遇到问题。我有一个 float ,我想将其四舍五入到小数点后的百分之一。但是,我只能使用 .round ,它基本上将它变成一个 int,意思是 2.34.round # => 2. 有没
我使用 ruby on rails 编写了一个小型 Web 应用程序,它的主要目的是上传、存储和显示来自 xml(文件最多几 MB)文件的结果。运行大约 2 个月后,我注意到 mongrel 进程
我们如何用 Ruby 转换像这样的字符串: 𝑙𝑎𝑡𝑜𝑟𝑟𝑒 收件人: Latorre 最佳答案 s = "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" => "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" s.u
通过 ruby monk 时,他们偶尔会从左侧字段中抛出一段语法不熟悉的代码: def compute(xyz) return nil unless xyz xyz.map {|a,
不确定我做错了什么,但我似乎弄错了。 问题是,给你一串空格分隔的数字,你必须返回最大和最小的数字。 注意:所有数字都是有效的 Int32,不需要验证它们。输入字符串中始终至少有一个数字。输出字符串必须
我是一名优秀的程序员,十分优秀!