无法创建写入文件

无法创建写入文件

问题描述:

我正在使用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

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

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