0

我正在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新文件说没有这样的文件时出现错误。正如我读过的那样,使用该选项打开文件w应该创建一个空文件进行写入。那为什么我会收到这样的错误?

另外,由于log_filecolumn 保存了原始文件的路径,并且我正在更改它,你能告诉如何用旧名称重命名新文件吗?正如我检查过的,我应该只指定oldnew名称,而不是路径。

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')
4

1 回答 1

3

啊,我现在看到你的问题了。当你这样做时

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

你称之为“自我改变”的版本sub,即sub!。这实际上会改变old_file_path作为副作用的值。然后,在下一行中,您尝试打开这个尚未创建的文件。去掉感叹号应该没问题。

于 2014-09-05T09:41:52.900 回答