本文的起因在
这里。在松底迪的鼓励和指导下,做了一个我认为合理的File实现,规则如下:
1. 追加String的to_file方法
2. 区分File对象的new和open,只有当需要对File的内容进行操作时,才open。
3. 推荐的new操作只有一个初始化参数即路径名,open方法只有mode及其它参数,一次典型的调用如下:
但为了照顾部分人的喜好,继承ruby胸怀宽广的传统,仍保留带open参数的new方式,如:
将按mode打开文件
4. 如果open调用带有block,则内部保证在block执行完毕后close文件,否则需要显示close.
4. 维持原File类的静态open方法的语义,典型调用如下:
5. 不需要了解文件内容,如信息查询等操作,全部作为instance method,包括:
详情请参考ruby的缺省File实现的文档
6. 对于目录,追加each遍历方法,并去掉恶心的“.", ".."两个东西,每一个遍历项是一个新的File对象,典型调用如下:
7. 追加文件实例的create方法
追加opened?方法,查询文件是否已被打开
维持path语义,返回构造时提供的路径名,类型为字符串,不做normalize
8. 其它功能均维持File的原状。
代码见附件,使用时在自己的脚本前require一下即可。
1. 追加String的to_file方法
ruby 代码
- "c:/temp/test.txt".to_file.exist?
2. 区分File对象的new和open,只有当需要对File的内容进行操作时,才open。
3. 推荐的new操作只有一个初始化参数即路径名,open方法只有mode及其它参数,一次典型的调用如下:
ruby 代码
- "name".to_file.open("mode") do |file|
- xxxxxxx
- end
ruby 代码
- File.new("name", "mode")
4. 如果open调用带有block,则内部保证在block执行完毕后close文件,否则需要显示close.
ruby 代码
- file = File.new("c:\\temp\\test.txt")
- puts file.open.readlines
- file.close
ruby 代码
- ”somefile.txt“.to_file.open { |file|
- puts file.readlines
- }
4. 维持原File类的静态open方法的语义,典型调用如下:
ruby 代码
- File.open("name", "mode") { |f|
- f.xxx
- }
5. 不需要了解文件内容,如信息查询等操作,全部作为instance method,包括:
ruby 代码
- :directory?, :file?, :readable?, :owned?, :pipe?, :mtime?, :extname, :ftype,
- :executable_real?, :executable?, :dirname, :exist?, :basename, :blockdev?,
- :chardev?, :atime, :chmod, :chown, :ctime, :delete, :grpowned?, :lchmod, :stat,
- :readable_real?, :readlink, :rename, :setgid, :setuid, :size, :size?, :socket?,
- :split, :sticky, :symlink?, :truncate, :writable?, :writable_real, :zero?
6. 对于目录,追加each遍历方法,并去掉恶心的“.", ".."两个东西,每一个遍历项是一个新的File对象,典型调用如下:
ruby 代码
- File.new("/dir").each { |child|
- if child.directory?
- ......
- else
- .....
- end
- }
7. 追加文件实例的create方法
ruby 代码
- "/somedir/somefile".to_file.create
维持path语义,返回构造时提供的路径名,类型为字符串,不做normalize
8. 其它功能均维持File的原状。
代码见附件,使用时在自己的脚本前require一下即可。