赞 | 5 |
VIP | 71 |
好人卡 | 22 |
积分 | 6 |
经验 | 32145 |
最后登录 | 2013-8-9 |
在线时间 | 184 小时 |
Lv2.观梦者 天仙
- 梦石
- 0
- 星屑
- 620
- 在线时间
- 184 小时
- 注册时间
- 2008-4-15
- 帖子
- 5023
|
懒得慢慢讲,把禾西的笔记丢给你,顺便去看一下说明档的 File 部分
文檔操作(Dir) < Object
Object 下的一個子類。所有 Obejct 能用的方法 Dir 都能用
:如何創建一個空文檔?
|Dir.mkdir("路徑")
路徑的類型一定要是 String,否則就會出錯
格式需要爲 /.../...的樣子
如果需要在 RM 目錄下建立新的文檔,就需要調用這樣的語句
|Dir.mkdir('./new_document')
這裏需要注意的是「.」,這個東西就是指示在自身目錄路徑下建立一個空文檔(子路徑)
如果沒有「.」
比如
|Dir.mkdir('/new_document')
文檔就不知道會飛到哪里去 Orz。完全找不到了
雖然存在於某處,不過用 window 的search 功能找不出來
如果同名(主要指同路徑)文檔已經存在,系統會發生錯誤
Errno::EEXIST異常 File Exist
:如何删除一個文檔?
删除文檔以前需要確認文檔爲空
成功的話會返回 0
|Dir.delete("./new_document") #=> 0
否則就引起 Errno::ENOTEMPTY異常 File NotEmpty
Ruby 提供了三個功能一樣的方法:
|Dir.delete("路徑")
|Dir.rmdir("路徑")
|Dir.unlink("路徑")
彼此之間沒有分別,隨便挑選一個用。(.delete 比較好記)
:如何打開一個文檔?
|Dir.new("路徑")
|Dir.open("路徑")
|Dir.open("路徑"){|dir| ...}
PS:Dir.open("路徑"){|dir| ...} 的附加探討請移步塊(Block)筆記
打開了的文檔記得要用
|dir變量名字.close
關閉
:如何關閉一個文檔?
看上面...
:Dir.open("路徑") 和 Dir.open("路徑"){|dir|...} 有甚麽分別?
其實沒有甚麽分別==
d = Dir.open("路徑") 和 dir 記錄的是同一個東西
加了 block 只會把 Dir.open("路徑") 的返回值原原本本地丟到 dir 裏面去
如果一定要說有甚麽不同點的話,只是返回值不同而已
Dir.open("路徑"){|dir|...} 會返回 block 的計算值
而不是 Dir.open("路徑")的返回值
而且使用 block 的時候是不需要調用 .close 語句
系統會自動幫你 close
block 的用法跟 .proc 有點相似
:如何查看一個文檔當中包含的文件?
|Dir.entries("路徑")
|Dir.new("路徑").to_a
|Dir.open("路徑").to_a
|Dir.open("路徑"){|dir|dir.to_a}
以上四個方法都是一樣的
都會返回目錄下所有文件的名字(String 格式),幷整合到一個數組當中
比如:
|Dir.open('.') #=>[".","..","Data","Game.exe","Game.ini","Game.rxproj","Audio","Graphics"]
:如何取得當前目錄路徑?
|Dir.getwd
|Dir.pwd
這兩個方法會返回當前所處的完整的目錄路徑(String 格式)
如果需要在路徑當中填入當前目錄路徑,只需要
|"."
就可以了
:如何更改當前所處的文檔名字(目錄路徑)?
|Dir.chdir("Ruby test")
:如何搜索當前文檔中的某些文件?
|Dir["文件名字樣式"]
|Dir.glob("文件名字樣式")
與其他的 Dir 方法一樣, Dir.glob 只能帶 String 樣式的參數
搜索的文件名字樣式一定要完整,連後綴都不能忽略
比如這樣:
|Dir.glob("Game") #=> []
|Dir.glob("Game.exe") #=> ["Game.exe"]
模糊搜查可以用 * 代替模糊部分
|Dir.glob("Game.*") #=> ["Game.exe", "Game.ini", "Game.rxproj"]
如果參數爲 "*" 就會匹配當前文件夾下所有文件
|Dir.glob("*") #=> ["Data","Game.exe","Game.ini","Game.rxproj","Audio","Graphics"]
此時作用「基本」跟 Dir.entries(".") 一樣
不過 Dir.glob( ) 不會讀取到 "." 和 ".." 兩個路徑
另外模糊部分也可以用[ ]指定模糊範圍
|Dir.glob("[B-G]ame.*")
需要注意的是,"*" 是不存在长度限制的,
也就是說 "*" 代表的可能是「一個字母」,或者「一串字母」,或者「任何符號」
如果需要精確字母長度的搜索,可以用 "?"
"?" 代表的只有一個字母,比如這樣:
|Dir["Game.???"] #=>["Game.exe", "Game.ini"]
|Dir["Game.?"] #=>[ ]
另外,還有 {a,b}的選擇性模糊搜索
|Dir["Game.{ini,exe}"] #=>["Game.exe", "Game.ini"]
模糊部分只要符合 {a,b}當中其中一個就會視作符合整個格式
注意的是,{ } 當中連空格都會視作匹配符之一。因此不是必要不要加入「" "」
這點與數組和Hash 表格有所不同
因爲 Dir.glob 只認當前目錄路徑
配合 Dir.chdir("路徑") 使用可以搜索其他位置的文檔
:如何對於文檔下的子文檔進行地氈式搜索
正常情况下,.glob 或者 [] 都不會讀取到 Actors.rxdata 等等的文件
原因是其位於文檔的子文檔之。這時,我們需要用地氈式搜索把他們找出來
|Dir["**/Actors.rxdata"] #=> ["Data/Actors.rxdata"]
|Dir.glob("**/Actors.rxdata") #=> ["Data/Actors.rxdata"]
"**/"的作用是:
由 "Actors.rxdata" 開始
然後"/Actors.rxdata","/*/Actors.rxdata"...
直至把文檔下的所有文件讀取到爲止
:關於 Dir.chdir("路徑")
根據幫助看來,這個函數「會把當前目錄路徑改爲新的路徑(也是其參數)」
但是實際上調用的時候,這個函數不會實際修改所處文檔下的所有東西
其修改只能通過
|Dir.getwd
來獲取。如果沒有估計錯誤,應該是配合"."路徑來使用的。
因爲 "." 路徑會跟隨當前目錄路徑而發生變化。
:關於"."路徑
在所有Dir方法當中調用"."路徑爲參數時,都會默認地指向當前所處的目錄路徑
:如何取得打開了的文檔的路徑?
|d = Dir.new(".")
|d.path #=> "當前所在的文件名字"
:如何歷遍瀏覽文檔中的每個文件名字?
|d = Dir.new(".")
|d..each {|file| p file } #=> print ".","..","Data","Game.exe","Game.ini","Game.rxproj","Audio","Graphics"
也可以用
|Dir.foreach("."){|file|...}
除了 .foreach 語句不需要 .close 關閉文檔以外
以上兩個方法是完全一樣的
補充說明:
:用整數方式讀取到當前路徑位置
|dir = Dir.open(".")
|pos1 = dir.pos
|pos2 = dir.tell
pos 語句跟 tell 語句基本一樣
:轉移到另一個路徑位置
|dir.pos = pos1
|dir.seek(pos2)
.pos=( ) 和 .seek 語句只能讀取由.pos 或者 .tell 獲取的整數位置
:從頭到尾逐個讀當前路徑當中的文件
|dir = Dir.open(".")
|dir.read #=> "."
|dir.read #=> ".."
|dir.read #=> "Data"
|dir.read #=> "Game.exe"
:究竟 ".", ".."是甚麽東西!?
"." :當前文檔路徑
"..":當前文檔路徑上一級的路徑
:dir.inspect → string
返回對於 dir 對象的 String 式說明。
跟 dir.to_s 相似
:Dir 的配合使用?
IO,File 是 Dir 的好朋友。
三者需要常常配合使用
附加說明 by webmaster[at]ruby-lang.org :
:Dir.chroot( string ) → 0
将根目录改为path。请参考chroot(2)。只有超级用户才能改变根目录。
您将无法还原到原来的根目录。
根目录变更成功时返回0,失败时将引发Errno::EXXX异常。
:dir.rewind → dir
将目录流的读取位置移到开头。返回self。 |
|