gpt4 book ai didi

ruby - 在 Ruby 中调用 FileUtils.copy_entry 时出现编码错误

转载 作者:太空宇宙 更新时间:2023-11-03 16:42:11 25 4
gpt4 key购买 nike

我正在编写用于递归复制和粘贴的代码。
但是调用 FileUtils.copy_entry

时出现编码错误

错误信息:

C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1535:in `join': incompatible character encodings: CP949 and UTF-8 (Encoding::CompatibilityError)
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1535:in `join'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1218:in `path'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:463:in `block in copy_entry'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1485:in `call'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1485:in `wrap_traverse'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1488:in `block in wrap_traverse'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1487:in `each'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1487:in `wrap_traverse'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1488:in `block in wrap_traverse'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1487:in `each'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1487:in `wrap_traverse'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:460:in `copy_entry'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:435:in `block in cp_r'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1558:in `block in fu_each_src_dest'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1574:in `fu_each_src_dest0'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:1556:in `fu_each_src_dest'
from C:/Ruby200/lib/ruby/2.0.0/fileutils.rb:434:in `cp_r'
from copy_test.rb:11:in `copy_files'
from copy_test.rb:81:in `block in <main>'
from copy_test.rb:76:in `each'
from copy_test.rb:76:in `<main>'


我正在这样调用 copy_entry

def copy_files(src, dst)  
FileUtils.mkdir_p(File.dirname(dst))
FileUtils.copy_entry(src, dst)
end

src 中有一些子文件夹和文件以我的本地语言命名。
所以我认为 (Encoding::CompatibilityError) 的发生是因为这些子文件夹和文件使用本地语言(不是英语)。
当我仅使用英语文件夹和文件进行测试时,它起作用了。
但是,我也需要非英文文件夹和文件。

我该如何解决这个问题?
我是否应该定义一个新方法来替换 copy_entry

我添加的代码:

# -*- encoding: cp949 -*-
require 'fileutils'

LIST_FILE = "backup_target_list.txt"
DEST_FILE = "backup_dest.txt"

def copy_files(src, dst)
FileUtils.mkdir_p(File.dirname(dst))
FileUtils.copy_entry(src, dst)
end

def get_dst_base_name()
cur_date = Time.now.to_s[0..9]
return "backup_#{cur_date}"
end

def get_backup_list(list_file)
if !File.exist?(list_file) then
return nil
end

path_arr = []

File.open(list_file, "r") do |f|
f.each_line { |line|
path_arr.push(make_path(line.gsub("\n", "")))
}
end

return path_arr
end

def get_dest(dest_file)
if !File.exist?(dest_file) then
return nil
end

return File.open(dest_file, "r").readline
end

def make_path(*str)
path_new = nil

str.each do |item|
if item.class == Array then
path_new = (path_new == nil ? File.join(item) : File.join(path_new, item))
else
if item.include?(File::ALT_SEPARATOR) then
path_new = (path_new == nil ? File.join(item.split(File::ALT_SEPARATOR)) : File.join(path_new, item.split(File::ALT_SEPARATOR)))
else
path_new = (path_new == nil ? File.join(item) : File.join(path_new, item))
end
end
end

return path_new
end

get_backup_list(LIST_FILE).each do |path|
src = path
tmp = src.split(File::SEPARATOR)
dst = make_path(get_dest(DEST_FILE), get_dst_base_name, tmp[1..tmp.length])
print "src: #{src}\n=> dst: #{dst}\n"
copy_files(src, dst)
end

最佳答案

我看到您使用的是 cp949 编码,出现的错误提示 CP949 和 UTF-8 不兼容,那么您为什么只使用 UTF-8 编码?所以将 shebang 替换为

# coding: UTF-8

并确保从 LIST_FILE 中读取的所有字符都是 utf-8 编码的,添加以下内容:

line.force_encoding('utf-8')

关于ruby - 在 Ruby 中调用 FileUtils.copy_entry 时出现编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44425438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com