Как скопировать содержимое файла в другой файл? - PullRequest
3 голосов
/ 15 мая 2011

Как бы это ни было базово, мне просто не удается скопировать содержимое одного файла в другой. Вот мой код:

#!/usr/bin/ruby

Dir.chdir( "/mnt/Shared/minecraft-server/plugins/Permissions" )

flist = Dir.glob( "*" )

flist.each do |mod|
    mainperms = File::open( "AwesomeVille.yml" )
    if mod == "AwesomeVille.yml"
        puts "Shifting to next item..."
        shift
    else
        File::open( mod, "w" ) do |newperms|
            newperms << mainperms
        end
    end
    puts "Updated #{ mod } with the contents of #{ mainperms }."
end

Ответы [ 3 ]

7 голосов
/ 16 мая 2011

Зачем копировать содержимое одного файла в другой?Почему бы не использовать операционную систему для копирования файла или использовать встроенную в Ruby FileUtils.copy_file?

ri FileUtils.copy_file
FileUtils.copy_file

(from ruby core)
------------------------------------------------------------------------------
  copy_file(src, dest, preserve = false, dereference = true)

------------------------------------------------------------------------------

Copies file contents of src to dest. Both of src and
dest must be a path name.

Более гибкий / мощный альтернативный вариант - использовать встроенную в Ruby FileUtils.cp:

ri FileUtils.cp
FileUtils.cp

(from ruby core)
------------------------------------------------------------------------------
  cp(src, dest, options = {})

------------------------------------------------------------------------------

Options: preserve noop verbose

Copies a file content src to dest.  If dest is a
directory, copies src to dest/src.

If src is a list of files, then dest must be a directory.

  FileUtils.cp 'eval.c', 'eval.c.org'
  FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
  FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', :verbose => true
  FileUtils.cp 'symlink', 'dest'   # copy content, "dest" is not a symlink
1 голос
/ 26 апреля 2014

Это работает для меня

IO.copy_stream mainperms, mod

§ copy_stream

0 голосов
/ 15 мая 2011

Я понимаю, что это не полностью одобренный способ, но

 IO.readlines(filename).join('') # join with an empty string because readlines includes its own newlines

Загрузит файл в строку, которую затем можно будет вывести в newperms, как если бы это была строка.Есть большая вероятность, что причина, по которой это не работает в настоящее время, заключается в том, что вы пытаетесь записать обработчик ввода-вывода в файл, а обработчик ввода-вывода не преобразуется в строку так, как вы этого хотите.

Тем не менее, другое исправление может быть

 newperms << mainperms.read

Кроме того, убедитесь, что вы закрываете основные области перед выходом из сценария, поскольку это может привести к поломке.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...