Ruby 文件IO操作(File)

特殊符号————点 允许使用类名或者模块名后,使用点(.ways)再加上方法名,来调用类或模块中的方法

特殊符号————双冒号,:: 是一元运算符 允许使用类名或模块名称后,加两个冒号 :: 和常量名,来引用类或模块中的常量。(非常重要) 在类或模块内定义常量、实例方法和类方法,可以从类或模块外的任何地方进行访问。

请记住: 在 Ruby 中,类和方法也可以被当作常量 ==》 这么来看:双冒号后面可加方法,这时双冒号可用被点代替

如果 :: 前的表达式为类名或模块名称,则返回该类或模块内对应的常量值(或者方法); 如果 :: 前未没有前缀表达式,则返回主Object类中对应的常量值。

Ruby中,文件是一种内嵌类,通过类实例化为对象,可以调用对象方法,它不需要require; Ruby 提供了处理文件和目录的方式。File 类用于处理文件,Dir 类用于处理目录。使用methods获取方法 File 表示一个连接到普通文件的 stdio 对象。open 为普通文件返回该类的一个实例句柄

核心:在线获取帮助 File.methods

=> [:empty?, :exist?, :size?, :size?, :owned?, :grpowned?, :pipe?, :symlink?, :socket?, :blockdev?, :chardev?, 
:setuid?, :setgid?, :sticky?, :identical?, :directory?, :readable?, :writable?, :executable?, :executable_real?, ]

=> [:new, :open, :sysopen, :stat, :lstat, :size, :path, :mtime, :ctime, :atime, :ftype, :basename, :dirname,
:read, :sysread, :binread, :write, :syswrite, :binwrite, :chmod, :lchmod, :chown, :lchown, :utime, :lutime, 
:link, :symlink, :readlink, :unlink, :rename, :umask, :hash, :class, :select, :readlines ]

Ruby File 类和方法,是IO类的子类,IO的操作将继承给File操作

File 模块用于操作——系统中的文件内容和文件属性等 File 类也拥有与文件相关的操作,比如通配符文件名匹配、创建文件等。

一、文件内容操作(继承IO操作)

a) 创建文件对象 == File::new方法

使用:STDFD = File.new("filename", "mode")

作用:初始化File类构造函数,根据mode模式生成一个文件对象

b) 关闭文件对象 == File::close方法

使用:STDFD.close()

作用:将指定的文件对象关闭

c) 打开文件型对象 == File::open方法

使用:STDFD = File.open("filename", "mode")

区别:它们之间不同点是 File.open 方法可与块关联,而 File.new 方法不能

d) 读取文件对象内容 == 继承IO类的标准输入 操作方法:STDIN.read() STDIN.sysread() STDIN.pread()

使用 STDFD.read(num)方法从文件读取指定数量的字符串,返回读出的符串。 STDFD.read(7) ==> strings,读取文件,引起文件位置指针随之改变 使用 STDFD.sysread(num)方法从文件读取指定数量的输入,返回读取的字符串,同read方法。 STDFD.sysread(32) ==> strings, 直到读取到文件末尾 使用 STDFD.pread(num,[offset])方法定位读取文件 STDFD.pread("",offset) ==> 一般用于文件操作

e) 写入文件对象内容 == 继承IO类的标准输出 操作方法:STDOUT.write() STDOUT.syswrite() STDOUT.pwrite()

使用 STDFD.write()方法文件字符串写入,返回成功写入的字符串数量。 STDFD.write("welcome to study ruby langage!") ==> num,不添加换行字符 使用 STDFD.syswrite()方法文件字符串写入,返回写入的数量,同write方法 STDFD.syswrite("Jacke and LuMing.") ==> num, 不添加换行符 使用 STDFD.pwrite("string",[offset])方法文件定位写入 STDFD.pwrite("",offset) ==> 常用于文件操作,文件也是IO的一种对象

f) 文件迭代器 == File::each_byte方法

使用: STDFD.each_byte{ |ch| putc ch ; putc ?. }

作用:可以迭代字符串中每个字符,字符一个接着一个被传到变量 ch,然后显示在屏幕上

g) 重置文件指针为起点 == File.rewind方法

使用:STDFD.rewind() 作用:将文件指针置为起点

下表列出了打开文件的不同模式: 模式 描述

r	只读模式。文件指针被放置在文件的开头。这是默认模式。
r+	读写模式。文件指针被放置在文件的开头。
w	只写模式。如果文件存在,则重写文件。如果文件不存在,则创建一个新文件用于写入。
w+	读写模式。如果文件存在,则重写已存在的文件。如果文件不存在,则创建一个新文件用于读写。
a	只写模式。如果文件存在,则文件指针被放置在文件的末尾。
   也就是说,文件是追加模式。如果文件不存在,则创建一个新文件用于写入。
a+	读写模式。如果文件存在,则文件指针被放置在文件的末尾。
   也就是说,文件是追加模式。如果文件不存在,则创建一个新文件用于读写

下表列出了文件的掩码和含义解释: 掩码 描述 0700 rwx 掩码,针对所有者 0400 r ,针对所有者 0200 w ,针对所有者 0100 x ,针对所有者 0070 rwx 掩码,针对所属组 0040 r ,针对所属组 0020 w ,针对所属组 0010 x ,针对所属组 0007 rwx 掩码,针对其他人 0004 r ,针对其他人 0002 w ,针对其他人 0001 x ,针对其他人 4000 执行时设置用户 ID 2000 执行时设置所属组 ID 1000 保存交换文本,甚至在使用后也会保存

类似的操作:—— File类,是IO类的子类,也可用于操作文件的一些方法

a) IO.readlines方法

使用:arr = IO.readlines("input.txt")

作用:该方法逐行返回文件的内容。下面的代码显示了方法 IO.readlines 的使用: 在这段代码中,变量 arr 是一个数组。文件 input.txt 的每一行将是数组 arr 中的一个元素。 因此,arr[0] 将包含第一行,而 arr[1] 将包含文件的第二行。

b) IO.foreach 方法

使用:IO.foreach("input.txt"){|block| puts block}

作用:该方法也逐行返回输出,将把文件 test 的内容逐行传给变量 block,然后输出将显示在屏幕上 它们不同的是,方法 foreach 与块相关联。但是,不像方法 readlines,方法 foreach 不是返回一个数组。例如:

二、文件操作

类方法调用:

1、类方法 ==》File::atime() 使用:File.atime(path),返回 path的最后一次访问时间 2、类方法 ==》File::ctime() 使用:File.ctime(path),返回 path状态的最后一次更改时间 3、类方法 ==》File::mtime() 使用:File.mtime(path),返回 path内容的最后一次更改时间 4、类方法 ==》File::chmod() 使用:File.chmod( mode, path...),改变指定文件的权限模式,返回执行结果 5、类方法 ==》File::chown() 使用:File.chown( owner, group, path...),改变指定文件的所有者和所属组,返回执行结果 6、类方法 ==》File::basename() 使用:File.basename( path[, suffix]),返回path末尾的文件名。如果指定了 suffix,则它会从文件名末尾被删除 7、类方法 ==》File::dirname() 使用:File.dirname( path),返回 path 的目录部分,不包括最后的文件名

8、是否是块设备 ==》File::blockdev?() 使用:File.blockdev( path),如果 path 是一个块设备,则返回 true 9、是否是字符设备 ==》File::chardev?() 使用:File.chardev(paht),如果 path 是一个字符设备,则返回 true 10、是否是普通文件 ==》File::file?() 使用:File.file( path),如果 path 是一个普通文件,则返回 true 11、是否是目录文件 ==》File::directory?() 使用:File.directory( path),如果 path 是一个目录,则返回 true 12、是否是管道文件 ==》File::pipe?() 使用:File.pipe( path),如果 path 是一个管道,则返回 true 13、是否是SOCK文件 ==》File::socket?() 使用:File.socket( path),如果 path 是一个 socket,则返回 true 14、是否是链接文件 ==》File::symlink?() 使用:File.symlink( path),如果 path 是一个符号链接,则返回 true 15、返回指向文件 ==》File::readlink() 使用:File.readlink( path),返回 path 所指向的文件 16、做软链接文件 ==》File::symlink() 使用:File.syslink( old, new),创建一个指向文件 old 的符号链接 17、做硬链接文件 ==》File::link() 使用:File.link( old, new),创建一个到文件 old 的硬链接

18、是否可读文件 ==》File::readable?() 使用:File.readable( path),如果 path 是可读的,则返回 true 19、是否真实可读 ==》File::readable_real?() 使用:File.readable_real( path),如果 path 通过真正的用户权限是可读的,则返回 true 20、是否可写文件 ==》File::writable?() 使用:File.writeable( path),如果 path 是可写的,则返回 true 21、是否真实可写 ==》File::writable_real?() 使用:File.writeable_real( path),如果 path 通过真正的用户权限是可写的,则返回 true 22、是否可执行 ==》File::executable?() 使用:File.executable( path),如果 path 是可执行的,则返回 true 23、是否真实可执行 ==》File::executable_real?() 使用:File.executable_real( path),如果 path 通过真正的用户权限是可执行的,则返回 true。

24、是否设置SGID位 ==》File::setgid?() 使用:File.setgid( path),如果设置了 path 的 set-group-id 权限位,则返回 true 25、是否设置SGID位 ==》File::setuid?() 使用:File.setuid( path),如果设置了 path 的 set-user-id 权限位,则返回 true 26、是否设置STID位 ==》File::sticky?() 使用:File.sticky( path),如果设置了 path 的 sticky 位,则返回 true 27、是否属于用户组 ==》File::grpowned?() 使用:File.grpowned( path),如果 path 由用户的所属组所有,则返回 true 28、是否属于有效用户 ==》File::owned?( path) 使用:File.owned( path),如果 path 由有效的用户所有,则返回 true

29、文件是否存在 ==》File::exist?() 使用:File.exist( path),如果 path 存在,则返回 true 30、文件是否为空 ==》File::zero?() 使用:File.zero( path),如果 path 的文件大小是 0,则返回 true 31、获取文件大小 ==》File::size( path) 使用:File.size( path),返回 path 的文件大小,如果为 0 则返回 nil 32、截断文件 ==》File::truncate() 使用:File.truncate( path, len),截断指定的文件为 len 字节

33、获取文件属性 ==》File::stat() 使用:File.stat( path),返回 path 上带有信息的 File::Stat 对象 34、获取符号属性 ==》File::lstat() 使用:File.lstat( path),与 stat 相同,但是它返回自身符号链接上的信息,而不是所指向的文件。 35、获取文件掩码 ==》File::umask([ mask]) 如果未指定参数,则为该进程返回当前的 umask。如果指定了一个参数,则设置了 umask,并返回旧的 umask 36、获取文件时间 ==》File::utime() 使用:File.utime( atime, mtime, path...),改变指定文件的访问和修改时间。 37、获取文件类型 ==》File::ftype() 使用:File.ftype( path),返回下列其中一个字符串,表示文件类型: file - 普通文件 directory - 目录 characterSpecial - 字符特殊文件
blockSpecial - 块特殊文件 fifo - 命名管道(FIFO) link - 符号链接
socket - Socket文件 unknown - 未知的文件类型】 38、获取文件路径 ==》File::expand_path() 使用:File.expand_path(path [,dir]),返回 path 的绝对路径,扩展: ~ 为进程所有者的主目录,~user 为用户的主目录。 相对路径是相对于 dir 指定的目录,如果 dir 被省略则相对于当前工作目录。

39、重命名文件 ==》File::rename() 使用:File.rename( "test1.txt", "test2.txt" ),改变文件名 old 为 new 40、删除一个存在文件 ==》File::delete() 使用:File.delete("text2.txt"),删除文件系统中指定的文件 41、删除一个存在文件 ==》File::unlink() 使用:File.unlink( path...),删除 path 给定的文件。

42、File::split( path) 返回一个数组,包含 path 的内容,path 被分成 File::dirname(path) 和 File::basename(path)。 43、File::join( item...) 返回一个字符串,由指定的项连接在一起,并使用 File::Separator 进行分隔。 例如:File::join("", "home", "usrs", "bin") # => "/home/usrs/bin" 44、File::new( path[, mode="r"]) or File::open( path[, mode="r"]) or File::open( path[, mode="r"]) {|f| ...} 打开文件。如果指定了块,则通过传递新文件作为参数来执行块。当块退出时,文件会自动关闭。 这些方法有别于 Kernel.open,即使 path 是以 | 开头,后续的字符串也不会作为命令运行。

文件操作实例

下面的命令在打开文件前检查文件是否已存在:

#!/usr/bin/ruby
File.open("file.rb") if File::exists?( "file.rb" )

实例

#!/usr/bin/ruby
File::directory?( "/usr/local/bin" ) # => true

实例

#!/usr/bin/ruby
File.readable?( "test.txt" )   # => true
File.writable?( "test.txt" )   # => true
File.executable?( "test.txt" ) # => false

实例

#!/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
File::atime( path)
返回 path 的最后访问时间。