Могу ли я создавать каталоги с динамическими именами во время выполнения, используя 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