无法创建用于写入的文件

时间:2014-09-05 08:50:35

标签: ruby-on-rails ruby file ruby-on-rails-4.1 ruby-2.1

我正在使用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列保留了原始文件的路径,并且我正在更改它,您能说明如何使用旧名称重命名新文件吗?我已经选中了,我应该只指定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')

1 个答案:

答案 0 :(得分:3)

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

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

你称之为sub的“自我修改”版本,即sub!。这实际上会将old_file_path的值更改为副作用。然后,在下一行中,您尝试打开尚未创建的此文件。拿出感叹号就可以了。