LFS - Lua File System

Introdução

O módulo LFS é um módulo externo que complementa as funções relacionadas a manipulação de arquivos já oferecidas pelos módulos padrão da distribuição Lua.

O LFS permite acesso a estrutura de diretórios e aos atributos de arquivo.

API

O LFS oferece a seguinte API:

Função

Valor de retorno

Descrição

lfs.attributes (filepath [, aname])

table

Retorna tabela com atributos de arquivos

lfs.currentdir ()

string ou nil

Retorna o diretório de trabalho corrente

lfs.chdir (path)

true ou (nil,err)

Muda o diretório corrente

lfs.dir (path)

(iter, dir_obj)

Lista o conteúdo de um dado diretório

lfs.mkdir (dirname)

true ou (nil,err)

Cria um novo diretório

lfs.rmdir (dirname)

true ou (nil,err)

Remove um determinado diretório

lfs.setmode (file, mode)

prev_mode_string

Define se arquivo é binário ou texto. Parâmetro mode pode ser ‘binary’ ou ‘text’.

lfs.touch (filepath [, atime [, mtime]])

true ou (nil,err)

Atualiza data de acesso e modificação de um arquivo.

lfs.lock_dir(path)

lock_obj ou (nil,err)

Cria arquivo de tranca para travar acesso ao diretório

lfs.lock (filehandle, mode[, start[, length]])

true ou (nil,err)

Trava acesso a um arquivo. Parâmetro mode pode ser ‘r’ (read/shared lock) ou ‘w’ (write/exclusive lock).

lfs.unlock (filehandle[, start[, length]])

true ou (nil,err)

Destrava acesso a um arquivo.

Para maiores detalhes consulte a referência da documentação original (em Inglês).

Exemplos de uso

Criação e remoção de diretório

function check(context, success,msg)
 if not success then
   print("Error in " .. context .. ":" .. msg)
 end
end

-- Cria novo diretório
lfs.mkdir("c:\\tmp\\novo")

-- Remove diretório criado
err,msg = lfs.rmdir("c:\\tmp\\novo")
check("rmdir",err,msg)

Percurso e identificação de atributos de arquivo

-- Função recursiva que imprime diretórios,arquivos e atributos
function attrdir(path)
        for file in lfs.dir(path) do
                if file ~= "." and file ~= ".." then
                        local f = path..'/'..file
                        print (f)
                        local attr = lfs.attributes (f)
                        assert (type(attr) == "table")
                        if attr.mode == "directory" then
                                attrdir (f)
                        else
                                for name, value in pairs(attr) do
                                        if name == "change" then
                                          print ("\t" .. name .. ": " ..  os.date("%d-%m-%Y %H:%M:%S",value))
                                        elseif  name == "modification" then
                                          print ("\t" .. name .. ": " ..  os.date("%d-%m-%Y %H:%M:%S",value))
                                        elseif  name == "access" then
                                          print ("\t" .. name .. ": " ..  os.date("%d-%m-%Y %H:%M:%S",value))
                                        else
                                          print ("\t" .. name .. ": " ..  value)
                                        end
                                end
                        end
                end
        end
end

-- Invocação da função para o diretório c:\tmp
attrdir("c:/tmp")

Exemplo de saída para um dado arquivo:

c:/tmp/simplc/simplc.py
                size: 11514
                change: 10-05-2012 14:13:12
                access: 10-05-2012 14:13:12
                modification: 10-05-2012 13:56:55
                mode: file               -- valores possíveis: file, directory, link, socket, named pipe, char device, block device, other
                dev: 2                   -- número do drive
                rdev: 2                  -- sempre igual a dev no Windows
                nlink: 1                 -- número de hardlinks para o arquivo
                uid: 0                   -- sempre 0 no Windows
                gid: 0                   -- sempre 0 no Windows
                ino: 0                   -- sem significado no Windows

Referências

Existem outros módulos em Lua que permitem manipulação do sistema de arquivos. A biblioteca Penlight, ainda que não inclusa por default no conjunto de módulos padrão, oferece diversas funções úteis relacionadas a manipulação de diretórios e arquivos.