Ruby: FileUtils.cp усекает файл; FileUtils.mv это не так? - PullRequest
2 голосов
/ 23 июня 2011

Это странно ... и я не могу понять, почему он так делает.

  1. У меня есть папка, полная различных CoffeeScript, SASS, HTML,и XML-файлы.
  2. У меня есть Ruby-скрипт , который берет их все, компилирует и сводит их в один главный XML-файл (он предназначен для разработки iGoogle Gadget).
    • Этот сценарий принимает аргументы командной строки, используя trollop (я только заявляю это для пояснения моего кода ниже).
  3. Я хочу, чтобы этот сценарий скопировал этот файл изтекущий каталог, в котором он был создан, в каталог назначения, в котором он будет запущен.

Пока что этап создания / компиляции / минимизации работает как по волшебству.Это # 3, переходящий на уровень Сумеречной Зоны.

#!/usr/bin/ruby
…
if opts[:deploy_local]
  FileUtils.cp 'build.xml', '/path/to/destination/'
  puts "Copied #{written_file_name} to #{output_destination}." if opts[:verbose]
end

Когда это копирует файл, целевой файл усекается примерно на 3/4 пути.Исходный файл просто отлично.Тем не менее, перемещение файла работает как чудо по какой-то странной причине.

  FileUtils.mv 'build.xml', '/path/to/destination/'

Чтобы добавить еще один уровень странности, если я просто делаю системную копию, она также усекается.

  system("cp build.xml /path/to/destination")

FWIW, я запускаю этот скрипт с zsh, а не bash.В обоих случаях (копирование и перемещение) исходный и целевой файлы не используются никаким другим процессом.

Кто-нибудь может объяснить это странное поведение?

1 Ответ

3 голосов
/ 03 декабря 2011

Несколько вещей:

  • Вы перемещаетесь на тот же том диска? Если так, то да, комментарий Кэма об атомарности определенно верен; ОС, вероятно, просто портит таблицу inode во время перемещения, в отличие от записи данных. Если вы перемещаете данные между томами, это было бы не так просто.

  • Вы пробовали проходить

    :verbose => true
    

    команде FileUtils.cp? Это может дать диагностику о сбое.

...