/folder_stash

Stashes files in nested folders

Primary LanguageRubyMIT LicenseMIT

folder_stash

The folder_stash gem will store files in a directory with a user definable number of nested subdirectories in a given path and a maximum number of items allowed per subdirectory.

New nested subdirectories will be created on demand as a given subdirectory reaches the specified limit of items. All created subdirectories will have randomized base names.

folder_stash uses a symlink (.current_store_path) to the currently available directory. By default the symlink will be in the top level storage directory, but it can optionally be placed in any directory.

Installation

gem install folder_stash

Usage

The basic usage is to create a new instance of FileUsher with the directory in which files are to be stored in; the top level storage directory.

require 'folder_stash'

# create a new FileUsher instance with defaults (2 levels of subdirectories,
# 10000 items per subdirectory)
usher = FolderStash::FileUsher.new('~/storage_dir')

FileUsher will try to locate the .current_store_path symlink, either in the top level directory, or, if any other location for the link passed as the link_location option passed to the initializer.

If the symlink does not exist, it will create a new branch (nested path) with the number of nested subdirectories given in the nesting_levels option passed to the initializer and create the symlink which will point to the terminal (most deeply nested) subdirectory.

storage_directory
├── .current_store_path -> ~/storage_dir/a1bd81a073a78025/2d9dfcd7a6c329b4
└── a1bd81a073a78025
    └── 2d9dfcd7a6c329b4

If the symlink exists, FileUsher will use the existing subdirectory hierarchy.

Files can be copied or moved to the directory the symlink currently points to using the #copy and #move methods respectively, which both will return the path the file was stored to.

usher.copy('~/image1.jpg')
# => "storage_dir/a1bd81a073a78025/2d9dfcd7a6c329b4/image1.jpg"

usher.move('~/image2.jpg')
# => "storage_dir/a1bd81a073a78025/2d9dfcd7a6c329b4/image2.jpg"

The path returned will by default start with the top level storage directory. It is possible to return the relative path or absolute path by passing the values :relative or :absolute as the pathtype option:

usher.copy('~/image3.jpg', :pathtype => :relative)
# => "path/to/storage_dir/a1bd81a073a78025/2d9dfcd7a6c329b4/image3.jpg"

usher.copy('~/image4.jpg', :pathtype => :absolute)
# => "/path/to/storage_dir/a1bd81a073a78025/2d9dfcd7a6c329b4/image4.jpg"