iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
1
Modern Web

關於 Ruby on Rails,我想說的是系列 第 9

[Day 9] 檔案操作 File,Dir,FileUtils(下)

  • 分享至 

  • xImage
  •  

接續昨天的文章,來介紹FileFileUtils

File

參數列表

# 參數前三個最常用的,如果是新增檔案,不管哪個變數都沒差。注意! 變數是必須

"w" : 若有檔案則打開原檔,清空內容,從頭開始寫入。
"a" : 若有檔案則打開原檔,將內容加在最後面。
"r" : 若有檔案則打開原檔,將內容加在最前面。
"r+": 讀取 / 寫入,不會主動建檔,將內容加在檔案最前面,會覆蓋原有內容,檔案必須存在)
"w+": 讀取 / 寫入。同 w 功能 
"a+": 讀取 / 寫入。同 a 功能
在每個模式後面加上"b" #例如 "rb" 或 "rb+",就可以開啟「二進位」模式

1.新增檔案

File.new('檔名','參數')

file = File.new('test.txt', 'w') # => #<File:test.txt> 

成功在當前目錄產生

2.寫入資料,關閉檔案

拿剛才的檔案file繼續使用

file.write("鐵人賽第九天\n主體是:檔案操作")  # 寫入內容
file.close       # 關閉檔案。若不關閉剛才寫入的內容不會被存起來
輸出結果:
鐵人賽第九天
主體是:檔案操作

3.開啟檔案/讀取檔案

file = File.open('test.txt', 'r+') # 開啟檔案
file.read  # 讀取檔案,回傳: "鐵人賽第九天\n主體是:檔案操作" 
file.close # 操作結束一定要關閉檔案

4.File.open(&block),離開block後會自動關閉檔案

現在相同資料夾內還有一個test.json檔案
內容是{"date": "2019/9/24"}
就可以把test.json內容寫入test.txt

content = File.read("test.json")  #先讀取`test.json`的內容
object = JSON.parse(content)    #解析json
File.open("test.txt", "a") { |file| 
  file.write("\n" + "Today is: " + object["date"] ) 
}  # "a"是打開檔案後把內容加在最後面
輸出結果:
鐵人賽第九天
主體是:檔案操作
Today is: 2019/9/24

如果執行多次寫入會怎麼樣

File.open("test.txt", "a") { |file| file.write("Today is: " + object["date"] + "\n") } 
File.open("test.txt", "a") { |file| file.write("Today is: " + object["date"] + "\n") } 
File.open("test.txt", "a") { |file| file.write("Today is: " + object["date"] + "\n") } 
File.open("test.txt", "a") { |file| file.write("Today is: " + object["date"] + "\n") } 
輸出結果:
鐵人賽第九天
主體是:檔案操作
Today is: 2019/9/24
Today is: 2019/9/24
Today is: 2019/9/24
Today is: 2019/9/24
Today is: 2019/9/24

5.檔案是否存在

File.exist?('test.json') # => true 

6.檔案大小計算

File.size('test.json') # => 26 

7.重新命名檔案

File.rename('test.json', 'new_test.json')

8.刪除檔案

File.delete('test.txt') # => 1 

9.檔案絕對路徑查詢

File.expand_path("test.json")
# => "/Users/maxhuang/Desktop/Todolist/test.json" 

File 小叮嚀

1. File.read vs. File.open (都要給絕對路徑)

File.read
把檔案內容讀取轉成字串,就算圖片九空.png也一樣(所以上面才可以用JSON.parse(content))

photo_file = File.read("九空.png")
# => "\x89PNG\r\n\u001A\n....很長...中略.....\xAEB`\x82"

File.open
是傳回一個檔案

#相對路徑
photo_file = File.open("九空.png") 
# => #<File:九空.png> 

#絕對路徑
photo_file = File.open("/Users/maxhuang/Desktop/Todolist/九空.png") 
# => #<File:/Users/maxhuang/Desktop/Todolist/九空.png> 

2.檔案的生命週期應該是 open-use-close ,否則會有memory leak

為什麼一定要關閉檔案?

你打開了一個檔案編輯,結果卻沒有把他關閉的話,他就會一直處於開啟狀態,占用硬體資源,buffer(暫存區)也不會清空。所以很多程式語言都會希望使用者關掉不用的檔案,我也被公司的高手提醒過(汗...)
另外,Ruby 的 File.open 如果有給block,會自動把file做close
但在一般狀態下,如果有file.write,file.close 是必須的

總算介紹完File了,下面的FileUtils就更簡單了


FileUtils

FileUtils 是Ruby的Module,用做資料夾或檔案的新增,複製,移動,刪除

1.建立資料夾

此目錄不存在才建立新資料夾

FileUtils.mkdir_p "#{Rails.root}/log/2019log"  
# => ["/Users/maxhuang/Desktop/Todolist/log/2019log"] 

2.刪除資料夾

FileUtils.rm_rf "#{Rails.root}/log/2019log"  
# => ["/Users/maxhuang/Desktop/Todolist/log/2019log"] 

剛才建立的 2019log資料夾就被刪除了

3.刪除檔案

FileUtils.rm "新九空.png" if File.exist?("新九空.png")
 # 如果刪除不存在的檔案會噴錯 Errno::ENOENT (No such file or directory @ apply2files - text.json)

4.複製整個資料夾內容

FileUtils.copy_entry("tmp", "new_dir")

產生new_dir資料夾,內容與tmp資料夾完全相同

5.移動檔案

FileUtils.mv('test.rb', 'tmp/')  

test.rb就被移到tmp資料夾底下

6.複製檔案

FileUtils.cp 'test.rb', 'tmp'

test.rb就被複製到tmp資料夾


一邊上班一邊寫文真低累啊
佩服那些文章質量俱佳的前輩
今天改完文章已經快一點了(இдஇ; )
睡...


上一篇
[Day 8] 檔案操作 File,Dir,FileUtils(上)
下一篇
[Day 10] 字串魔法師 - 正規表達式 RegExp
系列文
關於 Ruby on Rails,我想說的是23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言