2013-04-15 53 views
0

我和這個問題的海報完全一樣:Ruby (Errno::EACCES) on File.delete。與他不同,他爲解決方案提供的更改對我來說不起作用。File.delete上的紅寶石(Errno :: EACCES) - 以前的解決方案不起作用

這裏是我的代碼,這就是我想刪除原始文件的壓縮算法:

uncompressed_file = File.new(Rails.root + filepath) 
compressed_file = File.new(Rails.root + "#{filepath[0..filepath.size - 1]}.gz", "w+b") 
file_writer = Zlib::GzipWriter.new(compressed_file) 

buf = "" 
File.open(uncompressed_file, "rb") do | uncompressed | 
    while uncompressed.read(4096, buf) 
    file_writer << buf 
    end 
    file_writer.close 
end  

begin  
    files_changed_by_chmod = File.chmod(0777, uncompressed_file) 
rescue 
    puts "Something happened" 
end  
puts "Number of files changed by CHMOD : " + files_changed_by_chmod.to_s 
File.delete(uncompressed_file) 
File.rename(Rails.root + "#{filepath[0..filepath.size - 1]}.gz", Rails.root + filepath) 

你會發現有一對夫婦puts在那裏,確認什麼是使用chmod發生。輸出是這樣的:

Number of files changed by CHMOD : 1

並沒有Something happened。因此,運行chmod不會產生錯誤,並且chmod確實會修改一個文件(大概是uncompressed_file)。但是,我仍然在刪除行上收到Errno :: EACCESS錯誤。

爲什麼我不能刪除這些文件?它把我推上了牆。我正在運行Windows 8和Ruby 1.9.3。

編輯:下面的第一個答案解決了不能刪除文件的問題;然而,它會使我的代碼嘗試執行的作業無效(即,當我的文件通過解決方案中提供的壓縮算法運行,然後運行其他算法時,文件會損壞)。是的,我也嘗試在我的通貨膨脹方法中效仿這裏的編碼風格,但這沒有幫助。這裏是執行加密,解密代碼的我的檔案休息,減壓:

def inflate_attachment(filepath) 
    compressed_file = File.new(Rails.root + filepath) 

    File.open(compressed_file, "rb") do | compressed | 
     File.open(Rails.root + "#{filepath[0..filepath.size - 7]}_FULL.enc", 'w+b') do | decompressed | 
     gz = Zlib::GzipReader.new(compressed) 
     result = gz.read 
     decompressed.write(result) 
     gz.close 
     end 
    end 
    end 

def encrypt_attachment(filepath, cipher) 
    unencrypted_file = File.new(Rails.root + filepath)  
    encrypted_file = File.new(Rails.root + "#{filepath[0..filepath.size - 1]}.enc", "w") 

    buf = "" 
    File.open(encrypted_file, "wb") do |outf| 
     File.open(unencrypted_file, "rb") do |inf| 
     while inf.read(4096, buf) 
      outf << cipher.update(buf) 
     end 
     outf << cipher.final 
     end 
    end 
    end 

def decrypt_attachment(filepath, key, iv) 
    cipher = OpenSSL::Cipher.new(ENCRYPTION_TYPE) 
    cipher.decrypt 
    cipher.key = key 
    cipher.iv = iv 

    encrypted_file = File.new(Rails.root + filepath) 
    decrypted_file = File.new(Rails.root + "#{filepath[0..filepath.size - 5]}.dec", "w") 

    buf = "" 
    File.open(decrypted_file, "wb") do |outf| 
     File.open(encrypted_file, "rb") do |inf| 
     while inf.read(4096, buf) 
      outf << cipher.update(buf) 
     end 
     outf << cipher.final 
     end 
    end 
    end 

回答

0

我認爲可能有一些這樣做,你沒有正確關閉文件。我冒昧地重寫代碼,而無需使用chmod的東西(我不認爲是必要的)

filename = <your sourcefilename goes here> 
filename_gz = filename + ".gz" 

filepath = Rails.root + filename 
filepath_gz = Rails.root + filename_gz 

# gzip the file 
buffer = "" 
File.open(filepath) do |file| 
    Zlib::GzipWriter.open(filepath_gz) do |gz| 
    while file.read(4096, buffer) 
     gz << buffer 
    end 
    end 
end 

# moves the filepath_gz to filepath (overwriting the original file in the process!) 
FileUtils.mv(filepath_gz, filepath) 

正如你可以看到我用File.open(路徑),並通過一個塊。這樣做的效果是,文件將在塊退出時自動關閉。 我也改變了刪除/重命名代碼,只是將gziped文件移動到原始路徑,它具有相同的效果。

但是,我強烈建議您保留原始文件的備份。

+0

嗨Sascha,非常感謝這個迴應。它看起來非常優雅,代碼確實允許我刪除原始文件 - 但是,它會導致壓縮文件失去完整性(在我對它進行加密,解密並再次解壓縮之後)。我將用其餘的代碼更新原始問題。 –

+1

很高興我可以幫助至少與文件刪除問題。 –

+0

原來,我的代碼中的其他內容完全導致了完整性崩潰的問題。這實際上是針對揭示其他問題(它與路徑相關)的刪除問題的修復。再次感謝Sascha。 –