我正在使用txt
上传carrierwave
个文件。文件不小(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
新文件说没有这样的文件时,我收到错误。因为我read打开一个带有w
选项的文件应该创建一个空文件进行写入。那我为什么会收到这样的错误?
此外,由于log_file
列保留了原始文件的路径,并且我正在更改它,您能说明如何使用旧名称重命名新文件吗?我已经选中了,我应该只指定old
和new
名称,而不是路径。
Errno::ENOENT: No such file or directory - /home/gotqn/Rails/LogFilesAnalyser/LogFilesAnalyser/public/uploads/log_file/log_file/3/log_debug_temp.txt
奇怪的是,如果我在rails控制台中执行以下命令,则不会抛出错误并创建文件。
File.open('/home/gotqn/Rails/LogFilesAnalyser/LogFilesAnalyser/public/uploads/log_file/log_file/3/log_debug_temp.txt','w')
答案 0 :(得分:3)
new_file_path = old_file_path.sub! '.txt', '_temp.txt'
你称之为sub
的“自我修改”版本,即sub!
。这实际上会将old_file_path
的值更改为副作用。然后,在下一行中,您尝试打开尚未创建的此文件。拿出感叹号就可以了。