2014-09-05 44 views
0

我正在使用carrierwave上傳txt文件。這些文件不小(80 MB - 500 MB),我想刪除一些行以減小此大小(大約80%的文件大小將減少)。無法創建寫入文件

我已經爲了創建了一個模型的方法來清除這些行:

require 'fileutils' 

def clear_unnecessary_lines 
    old_file_path = Rails.root.join('public').to_s + log_file.to_s 
    new_file_path = old_file_path.sub! '.txt', '_temp.txt' 
    File.open(old_file_path, 'r') do |old_file| 
    File.open(new_file_path, 'w') do |new_file| 
     old_file.each_line do |line| 
     new_file.write(line) unless line.grep(/test/).size > 0 
     end 
    end 
    end 
    FileUtils.mv new_file_path, old_file_path 
end 

,但我得到的錯誤,當我試圖open新文件說有沒有這樣的文件。因爲我有readw選項打開一個文件應該創建一個空文件進行寫入。那爲什麼我得到這樣的錯誤?

此外,由於log_file列保留原始文件的路徑,我正在改變它,你能告訴如何用新名稱重命名新文件嗎?正如我檢查,我應該只指定oldnew名稱,而不是路徑。

Errno::ENOENT: No such file or directory - /home/gotqn/Rails/LogFilesAnalyser/LogFilesAnalyser/public/uploads/log_file/log_file/3/log_debug_temp.txt 

奇怪的是,如果我在軌控制檯執行以下命令,它不引發錯誤,並創建的文件。

File.open('/home/gotqn/Rails/LogFilesAnalyser/LogFilesAnalyser/public/uploads/log_file/log_file/3/log_debug_temp.txt','w') 
+0

你確定這是你認爲這是導致問題的線?它實際上在File.open(old_file_path,'r')'上出錯嗎?使用「w」選項的File.open不需要該文件已經存在,但需要使用「r」選項來存在該文件(因爲它正在讀取它)。 – 2014-09-05 09:10:08

+0

@MaxWilliams是的,我確定。我已經評論了關於'new_file'的代碼,它正在工作。另外,請注意錯誤是關於'log_debug_temp.txt','old_file'的名稱是'log_debug.txt' – gotqn 2014-09-05 09:13:03

+0

腳本是否以必要的權限運行? – BroiSatse 2014-09-05 09:34:43

回答

3

啊,我現在看到你的問題了。當你這樣做

new_file_path = old_file_path.sub! '.txt', '_temp.txt' 

你打電話的sub的「自我改變」版本,即sub!。這實際上會改變old_file_path的值作爲副作用。然後,在下一行中,嘗試打開尚未創建的文件。拿出感嘆號,你應該沒問題。

+0

我到底在想什麼...... – gotqn 2014-09-05 09:56:26

+1

因此,在File.open(old_file_path,'r')'line後出現錯誤? ;-) – 2014-09-05 10:00:28

+0

是的,事實上它是。 – gotqn 2014-09-05 10:04:53