У меня есть метод в скрипте Ruby, который пытается переименовать файлы перед их сохранением.Выглядит это так:
def increment (path)
if path[-3,2] == "_#"
print " Incremented file with that name already exists, renaming\n"
count = path[-1].chr.to_i + 1
return path.chop! << count.to_s
else
print " A file with that name already exists, renaming\n"
return path << "_#1"
end
end
Допустим, у вас есть 3 файла с одинаковым именем, которые сохраняются в каталоге, и мы скажем, что файл называется example.mp3
.Идея состоит в том, что первое будет сохранено как example.mp3
(поскольку оно не будет перехвачено if File.exists?("#{file_path}.mp3")
в другом месте скрипта), второе будет сохранено как example_#1.mp3
(поскольку оно перехвачено else
часть описанного выше метода), а третья как example_#2.mp3
(поскольку она перехватывается частью if
вышеупомянутого метода).
У меня двойственная проблема.
1) if path[-3,2] == "_#"
не будет работать для файлов с целым числом более одной цифры (например, example_#11.mp3
), поскольку размещение символов будет неправильным (вам нужно, чтобы оно было path[-4,2]
но тогда это не справляется с 3-значными числами и т. д.).
2) Я никогда не сталкиваюсь с проблемой 1), поскольку метод не может надежно отлавливать имена файлов.В настоящий момент он будет переименовывать первый в example_#1.mp3
, но второй переименовывается в то же самое (что приводит к перезаписи ранее сохраненного файла).
Возможно, это слишком расплывчато для переполнения стека, но я не могу найти ничего, что решало бы проблему увеличения определенной части строки.
Заранее спасибо!
Редактирование / обновление:
Представленный ниже метод Уэйна, кажется, работает сам по себе, но не в том случае, если он включен как часть всего сценария - он может увеличить файл один раз (с example.mp3
до example_#1.mp3
) но не справляется с принятием example_#1.mp3
и увеличением его до example_#2.mp3
.Чтобы обеспечить немного больше контекста - в настоящее время, когда скрипт находит файл для сохранения, он передает имя методу Уэйна следующим образом:
file_name = increment(image_name)
File.open("images/#{file_name}.jpeg", 'w') do |output|
open(image_url) do |input|
output << input.read
end
end
Я немного отредактировал скрипт Уэйна, так что теперь он выглядит так:
def increment (name)
name = name.gsub(/\s{2,}|(http:\/\/)|(www.)/i, '')
if File.exists?("images/#{name}.jpeg")
_, filename, count, extension = *name.match(/(\A.*?)(?:_#(\d+))?(\.[^.]*)?\Z/)
count = (count || '0').to_i + 1
"#{name}_##{count}#{extension}"
else
return name
end
end
Куда я иду?Еще раз спасибо заранее.