Могу ли я создавать каталоги с динамическими именами во время выполнения, используя Ruby1.9?

Я должен загрузить файлы из Интернета по нескольким запросам. Загруженные файлы для каждого запроса должны быть помещены в папку с тем же именем, что и номер запроса.

Например:

Мой скрипт запущен для загрузки файлов по запросу номер 87665. Таким образом, все загруженные файлы должны быть помещены в папку назначения Current Download\Attachment87665, Так как мне это сделать?

Папка назначения: Current Download фиксированный. нужно только создать Attachmentxxxxxx динамически, где xxxxxx любой номер запроса.

Это Python-версия кода: но я хочу это в Ruby, просто для вашей справки, чтобы понять, что я ищу

request_number = 82673

# base dir
_dir = "D:\Current Download"       

# create dynamic name, like "D:\Current Download\Attachment82673"
_dir = os.path.join(_dir, 'Attachment%s' % request_number)

# create 'dynamic' dir, if it does not exist
if not os.path.exists(_dir):
    os.makedirs(_dir)

2 ответа

Решение

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

Взгляните на модуль Ruby Tempfile, который предназначен для того, о чем вы говорите, в частности, open метод.

Утилита для управления временными файлами. Когда вы создаете объект Tempfile, он создает временный файл с уникальным именем файла.

require 'tempfile'

file = Tempfile.new('foo')
file.path      # => A unique filename in the OS's temp directory,
            #    e.g.: "/tmp/foo.24722.0"
            #    This filename contains 'foo' in its basename.
file.write("hello world")
file.rewind
file.read      # => "hello world"
file.close
file.unlink    # deletes the temp file

Также прочитайте документ о "Явном закрытии" и "Разъединить после создания".

Независимо от того, что вы делаете, чем больше файлов существует в данной папке, тем больше времени потребуется системе или вашему коду для создания уникального имени файла.

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

И " Создать уникальные имена файлов " также говорит об этой проблеме со многими решениями. Лучше всего использовать uuidgen в *nix системах.

Команда uuidgen генерирует универсальный уникальный идентификатор (UUID), 128-битное значение, которое гарантированно будет уникальным как в пространстве, так и во времени.

Использование Dir.mkdir("#{Rails.root}/#{whatever}/#{example.join('bla')}"),
http://www.ruby-doc.org/core-1.9.3/Dir.html

Другие вопросы по тегам