-------------------------------------------------------------------------------- -- Copyright (c) 2012-2014 Sierra Wireless. -- All rights reserved. This program and the accompanying materials -- are made available under the terms of the Eclipse Public License v1.0 -- which accompanies this distribution, and is available at -- http://www.eclipse.org/legal/epl-v10.html -- -- Contributors: -- Kevin KIN-FOO -- - initial API and implementation and initial documentation -------------------------------------------------------------------------------- local lfs = require 'lfs' local M = {} local function iswindows() local p = io.popen("echo %os%") if not p then return false end local result =p:read("*l") p:close() return result == "Windows_NT" end M.separator = iswindows() and [[\]] or [[/]] --- -- Will recursively browse given directories and list files encountered -- @param tab Table, list where files will be added -- @param dirorfiles list of path to browse in order to build list. -- Files from this list will be added to tab list. -- @return tab list, table containing all files from directories -- and files contained in dirorfile local function appendfiles(tab, dirorfile) -- Nothing to process if #dirorfile < 1 then return tab end -- Append all files to list local dirs = {} for _, path in ipairs( dirorfile ) do -- Determine element nature local elementnature = lfs.attributes (path, "mode") -- Handle files if elementnature == 'file' then table.insert(tab, path) else if elementnature == 'directory' then -- Check if folder is accessible local status, error = pcall(lfs.dir, path) if not status then return nil, error end -- -- Handle folders -- for diskelement in lfs.dir(path) do -- Format current file name local currentfilename if path:sub(#path) == M.separator then currentfilename = path .. diskelement else currentfilename = path .. M.separator .. diskelement end -- Handle folder elements local nature, err = lfs.attributes (currentfilename, "mode") -- Append file to current list if nature == 'file' then table.insert(tab, currentfilename) elseif nature == 'directory' then -- Avoid current and parent directory in order to avoid -- endless recursion if diskelement ~= '.' and diskelement ~= '..' then -- Handle subfolders table.insert(dirs, currentfilename) end end end end end end -- If we only encountered files, going deeper is useless if #dirs == 0 then return tab end -- Append files from encountered directories return appendfiles(tab, dirs) end --- -- Provide a list of files from a directory -- @param list Table of directories to browse -- @return table of string, path to files contained in given directories function M.filelist(list) if not list then return nil, 'No directory list provided' end return appendfiles({}, list) end function M.checkdirectory( dirlist ) if not dirlist then return false end local missingdirs = {} for _, filename in ipairs( dirlist ) do if not lfs.attributes(filename, 'mode') then table.insert(missingdirs, filename) end end if #missingdirs > 0 then return false, missingdirs end return true end function M.fill(filename, content) -- -- Ensure parent directory exists -- local parent = filename:gmatch([[(.*)]] .. M.separator ..[[(.+)]])() local parentnature = lfs.attributes(parent, 'mode') -- Create parent directory while absent if not parentnature then lfs.mkdir( parent ) elseif parentnature ~= 'directory' then -- Notify that disk element already exists return nil, parent..' is a '..parentnature..'.' end -- Create actual file local file, error = io.open(filename, 'w') if not file then return nil, error end file:write( content ) file:close() return true end return M