:TITLE: Informação sobre arquivos - file, glob
;#
;# RCSID: $Header: /home/clif/CVS_ROOT/TclTutor/Tcl25.lsn,v 1.12 2000/04/24 16:17:51 clif Exp $
;# Copyright (c) 1995 Clif Flynt
;# 9300 Fleming Rd.
;# Dexter, MI  48130
;# clif@cflynt.com
;# Veja o arquivo "AVISO" com os termos da licença.
;#
;#*********************************************************
;# Portuguese translation: Lucio Agostinho Rocha
;# E-mail: outrosdiasvirao@yahoo.com.br
;# Last update: 10/01/2006
;#*********************************************************
::CMD:: if {([info exists tcl_platform])} {
  switch $tcl_platform(platform) {
    unix        {
                set Tutor(lsn.codeMod) {
                    {regsub "modelo1" $line "/usr/bin/*ail*" line}
                    {regsub "modelo2" $line "/bin/*ail*" line}
                }
        }
    windows     {
                set Tutor(lsn.codeMod) {
                    {if {[glob -nocomplain C:/winnt] != ""} {
                      regsub "modelo1" $line "C:/winnt/system32/w*.dll" line
                      regsub "modelo2" $line "C:/winnt/system32/win*.exe" line
                      } else {
                      regsub "modelo1" $line "C:/windows/w*.dll" line
                      regsub "modelo2" $line "C:/windows/win*.exe" line
                      }
                    }
                }         
        }
    mac         {
                set Tutor(lsn.codeMod) {
		}
                }
    default     {
                puts "I don't recognize the platform: $tcl_platform(platform)"
                puts "Can't set platform specific parameters"
                }
    } 
  }

:LESSON_TEXT_START_LEVEL 0:
Há dois comandos que fornecem informação sobre o conteúdo de
diretórios e arquivos dentro daqueles diretórios. Esses dois
comandos são <CODE>glob</CODE> e <CODE>file</CODE>.
<P>
<B>Glob</B> fornece o acesso para os nomes dos arquivos em um diretório.
É similar ao comando shell <B>ls</B>.
<P>
<B>File</B> fornece serviços similares aqueles fornecidos pela
chamada stat(2)
<DL>
<B><DT>glob</b> <I>?modificadores? modelo ?modeloN?</I>
<DD>Retorna uma lista dos nomes de arquivos compatíveis com o <I>modelo</I>.
<P>
<I>modificadores</I> podem ser um dos seguintes:
<DL>
<B><DT>-nocomplain</B>
<DD>Permite ao comando <CODE>glob</CODE> retornar uma lista vazia sem
causar um erro. Sem esse indicador, um erro seria gerado quando a
lista vazia fosse retornada.
<B><DT>--</B>
<DD>Indica o fim dos delimitadores. Isso permite o uso de "-" em um modelo
sem confundir o tratador do comando <CODE>glob</CODE>.
</DL>
<P>
<I>modelo</I> segue as mesmas regras de busca da técnica
<I>globbing</I> de <CODE>string match</CODE> com essas
exceções:
<UL>
<B><LI>{a,b,...}</B> Encontra qualquer uma das string a,b, etc.
<LI> Um "." no início de um nome de arquivo deve encontrar um
"." no nome do arquivo. O "." é apenas um <I>wildcard</I> se
ele não for o primeiro caracter em um nome.
<LI>Todas as "/" devem encontrar exatamente as "/".
<LI>Se os primeiros dois caracteres em <I>modelo</I> são <B>~/</B>, então o <B>~</B> é
substituído pelo valor da variável de ambiente <B>HOME</B>.
<LI>Se o primeiro caracter em <I>modelo</I> é um <B>~</B>, seguido por um número
de identificação (id) de login, então o <B>~IDlogin</B> é substituído pelo
caminho do diretório <I>home</I> do usuário que possui o <I>IDlogin</I>.
</UL>
Note que os nomes de arquivos compatíveis com o <I>modelo</I> não estão
ordenados.
<B><DT>file atime</B> <I>nome</I>
<DD>Retorna o número de segundos desde 1/1/1970 quando o arquivo <I>nome</I>
foi acessado pela última vez. Gera um erro se o arquivo não existe, ou
o tempo de acesso não pôde ser consultado.
<B><DT>file dirname</B> <I>nome</I>
<DD>Retorna a porção do diretório de uma string caminho/nomeArquivo. Se <I>nome</I>
não contém barras, <B>file dirname</B> retorna um ".".  Se a última "/"
em <I>nome</I> é também o primeiro caracter, ele retorna uma "/".
<B><DT>file executable</B> <I>nome</I>
<DD>Retorna um 1 se o arquivo <I>nome</I> é executável pelo usuário atual,
caso contrário retorna um 0.
<B><DT>file exists</B> <I>nome</I>
<DD>Retorna um 1 se o arquivo <I>nome</I> existe, e o usuário tem acesso de
pesquisa em todos os diretórios seguintes ao arquivo. Caso contrário, um 0 é retornado.
<B><DT>file extension</B> <I>nome</I>
<DD>Retorna a extensão do arquivo <I>nome</I>.
<B><DT>file isdirectory</B> <I>nome</I>
<DD>Retorna 1 se o arquivo <I>nome</I> é um diretório. Caso contrário retorna 0.
<B><DT>file isfile</B> <I>nome</I>
<DD>Retorna 1 se o arquivo <I>nome</I> é um arquivo regular. Caso contrário retorna 0.
<B><DT>file lstat</B> <I>nome nomeVar</I>
<DD>Retorna a mesma informação retornada pela chamada de sistema 
<B>lstat</B>. Os resultados são colocados no vetor associativo
<I>nomeVar</I>. Os índices em <I>nomeVar</I> são:
<UL COMPACT>
<B><LI>atime</B>.......data do último acesso
<B><LI>ctime</B>.......data da última mudança de status do arquivo
<B><LI>dev</B>...........dispositivo do inode
<B><LI>gid</B>............número de identificação (ID) do grupo ao qual o arquivo pertence
<B><LI>ino</B>............número do inode
<B><LI>mode</B>.......mode de proteção do inode
<B><LI>mtime</B>.....data da última modificação de dados
<B><LI>nlink</B>........número de <I>hard links</I>
<B><LI>size</B>...........tamanho do arquivo, em bytes
<B><LI>type</B>..........Tipo do arquivo
<B><LI>uid</B>.............ID de usuário do dono do arquivo
</UL>
Como o comando chama <B>lstat</B>, se <I>nome</I> é um <I>link simbólico</I>
os valores em <I>nomeVar</I> irão se referir ao link, e não ao arquivo que
está <I>linkado</I>.
<P>
Veja <I>stat</I> também.
<B><DT>file mtime</B> <I>nome</I>
<DD>Retorna a data da última modificação de dados em segundos desde
Jan 1, 1970.
<B><DT>file owned</B> <I>nome</I>
<DD>Retorna 1 se o arquivo é usuário atual é o dono do arquivo. Caso contrário,
retorna 0.
<B><DT>file readable</B> <I>nome</I>
<DD>Retorna 1 se o arquivo pode ser lido pelo usuário atual. Caso contrário,
retorna 0.
<B><DT>file readlink</B> <I>nome</I>
<DD>Retorna o nome do arquivo que um <I>link simbólico</I> está
apontando. Se o <I>nome</I> não é um <I>link simbólico</I>, ou não
pode ser lido, um erro é gerado.
<B><DT>file rootname</B> <I>nome</I>
<DD>Retorna todos os caracteres em <I>nome</I>, mas não incluindo o
último ".". Retorna <I>$nome</I> se <I>nome</I> não inclui um ".".
<B><DT>file size</B> <I>nome</I>
<DD>Retorna o tamanho de <I>nome</I> em bytes.
<B><DT>file stat</B> <I>nome nomeVar</I>
Retorna a mesma informação retornada pela chamada de sistema
<B>stat</B>. Os resultados são colocados no vetor associativo
<I>nomeVar</I>. Os índices em <I>nomeVar</I> são:
<UL COMPACT>
<B><LI>atime</B>.......data do último acesso
<B><LI>ctime</B>.......data da última mudança de status do arquivo
<B><LI>dev</B>...........dispositivo do inode
<B><LI>gid</B>............ID do grupo do arquivo
<B><LI>ino</B>............número do inode
<B><LI>mode</B>.......modo de proteção do inode
<B><LI>mtime</B>.....data da última modificação de dados
<B><LI>nlink</B>........número de <I>hard links</I>
<B><LI>size</B>...........tamanho do arquivo, em bytes
<B><LI>type</B>..........Tipo do arquivo
<B><LI>uid</B>.............ID de usuário do dono do arquivo
</UL>
<B><DT>file tail</B> <I>nome</I>
<DD>Retorna todos os caracteres em <I>nome</I> depois da última
barra. Retorna <I>$nome</I> se <I>nome</I> não contém barras.
<B><DT>file type</B> <I>nome</I>
<DD>Retorna uma string que fornece o tipo do arquivo <I>nome</I>
que pode ser um dos seguintes:
<UL COMPACT>
<B><LI>file</B>...................................Arquivo normal
<B><LI>directory</B>........................Diretório
<B><LI>characterSpecial</B>.......Dispositivo orientado a caracter
<B><LI>blockSpecial</B>.............. Dispositivo orientado a bloco
<B><LI>fifo</B>...................................Pipe nomeado
<B><LI>link</B>..................................Link simbólico
<B><LI>socket.</B>...........................Socket nomeado
</UL>
<B><DT>file writable</B> <I>nome</I>
<DD>Retorna 1 se o arquivo <I>nome</I> pode ser acessado para escrita pelo usuário atual.
Caso contrário, retorna 0.
</DL>

:TEXT_END:

:LESSON_TEXT_START_LEVEL 1:
Há dois comandos que fornecem informação sobre o sistema de arquivos,
<CODE>glob</CODE> e <CODE>file</CODE>.
<P>
<B>Glob</B> fornece o acesso a nomes de arquivos em um diretório.
Ele utiliza um mecanismo de pesquisa de nomes similar ao <B>ls</B>, 
para retornar uma lista dos nomes que são compatíveis com um modelo.
<P>
<B>File</B> fornece dois conjuntos de funcionalidades:
<UL COMPACT> 
<LI>manipulação de string apropriada para o tratamento de
nomes de arquivos:
<UL COMPACT>
<B><LI> dirname </B> ........ Retorna a porção do diretório de cada caminho
<B><LI> extension</B>........ Retorna a extensão do nome do arquivo
<B><LI> rootname</B> ....... Retorna o nome do arquivo sem a extensão
<B><LI> tail</B> .................... Retorna o nome do arquivo sem o diretório
</UL>
<LI> informação sobre uma entrada em um diretório:
<UL COMPACT>
<B><LI> atime</B> ................ Retorna a data do último acesso
<B><LI> executable</B> ..... Retorna 1 se o arquivo é executável pelo usuário
<B><LI> exists</B> ................ Retorna 1 se o arquivo existe
<B><LI> isdirectory</B> ...... Retorna 1 se a entrada é um diretório
<B><LI> isfile</B> .................. Retorna 1 se a entrada é um arquivo regular
<B><LI> lstat</B> ................... Retorna um vetor de informação de status do arquivo
<B><LI> mtime</B> ............... Retorna a data da última modificação de dados
<B><LI> owned</B> ................ Retorna 1 se o arquivo é de propriedade do usuário
<B><LI> readable</B>............ Retorna 1 se o arquivo é pode ser lido pelo usuário
<B><LI> readlink</B>............. Retorna o nome do arquivo apontado pelo <I>link simbólico</I>
<B><LI> size</B> ..................... Retorna o tamanho do arquivo, em bytes
<B><LI> stat</B> ..................... Retorna um vetor de informação de status do arquivo
<B><LI> type</B> .................... Retorna o tipo do arquivo
<B><LI> writable</B> ............ Retorna 1 se o arquivo pode ser acessado para escrita pelo usuário
</UL>
</UL>
Em meio a esses dois comandos, um programa pode obter a maior parte da
informação que ele pode precisar.
<DL>
<B><DT>glob</b> <I>?modificadores? modelo ?modeloN?</I>
<DD>Retorna uma lista dos nomes de arquivos compatíveis com o <I>modelo</I>.
<P>
<I>modificadores</I> podem ser um dos seguintes:
<DL>
<B><DT>-nocomplain</B>
<DD>Permite ao comando <CODE>glob</CODE> retornar uma lista vazia sem
causar um erro. Sem esse indicador, um erro seria gerado quando a
lista vazia fosse retornada.
<B><DT>--</B>
<DD>Indica o fim dos delimitadores. Isso permite o uso de "-" em um modelo
sem confundir o tratador do comando <CODE>glob</CODE>.
</DL>
<P>
<I>modelo</I> segue as mesmas regras de busca da técnica
<I>globbing</I> de <CODE>string match</CODE> com essas
exceções:
<UL>
<B><LI>{a,b,...}</B> Encontra qualquer uma das string a,b, etc.
<LI> Um "." no início de um nome de arquivo deve encontrar um
"." no nome do arquivo. O "." é apenas um <I>wildcard</I> se
ele não for o primeiro caracter em um nome.
<LI>Todas as "/" devem encontrar exatamente as "/".
<LI>Se os primeiros dois caracteres em <I>modelo</I> são <B>~/</B>, então o <B>~</B> é
substituído pelo valor da variável de ambiente <B>HOME</B>.
<LI>Se o primeiro caracter em <I>modelo</I> é um <B>~</B>, seguido por um número
de identificação (id) de login, então o <B>~IDlogin</B> é substituído pelo
caminho do diretório <I>home</I> do usuário que possui o <I>IDlogin</I>.
</UL>
Note que os nomes de arquivos compatíveis com o <I>modelo</I> não estão
ordenados.
<B><DT>file atime</B> <I>nome</I>
<DD>Retorna o número de segundos desde 1/1/1970 quando o arquivo <I>nome</I>
foi acessado pela última vez. Gera um erro se o arquivo não existe, ou
o tempo de acesso não pôde ser consultado.
<B><DT>file dirname</B> <I>nome</I>
<DD>Retorna a porção do diretório de uma string caminho/nomeArquivo. Se <I>nome</I>
não contém barras, <B>file dirname</B> retorna um ".".  Se a última "/"
em <I>nome</I> é também o primeiro caracter, ele retorna uma "/".
<B><DT>file executable</B> <I>nome</I>
<DD>Retorna um 1 se o arquivo <I>nome</I> é executável pelo usuário atual,
caso contrário retorna um 0.
<B><DT>file exists</B> <I>nome</I>
<DD>Retorna um 1 se o arquivo <I>nome</I> existe, e o usuário tem acesso de
pesquisa em todos os diretórios seguintes ao arquivo. Caso contrário, um 0 é retornado.
<B><DT>file extension</B> <I>nome</I>
<DD>Retorna a extensão do arquivo <I>nome</I>.
<B><DT>file isdirectory</B> <I>nome</I>
<DD>Retorna 1 se o arquivo <I>nome</I> é um diretório. Caso contrário retorna 0.
<B><DT>file isfile</B> <I>nome</I>
<DD>Retorna 1 se o arquivo <I>nome</I> é um arquivo regular. Caso contrário retorna 0.
<B><DT>file lstat</B> <I>nome nomeVar</I>
<DD>Retorna a mesma informação retornada pela chamada de sistema 
<B>lstat</B>. Os resultados são colocados no vetor associativo
<I>nomeVar</I>. Os índices em <I>nomeVar</I> são:
<UL COMPACT>
<B><LI>atime</B>.......data do último acesso
<B><LI>ctime</B>.......data da última mudança de status do arquivo
<B><LI>dev</B>...........dispositivo do inode
<B><LI>gid</B>............número de identificação (ID) do grupo ao qual o arquivo pertence
<B><LI>ino</B>............número do inode
<B><LI>mode</B>.......mode de proteção do inode
<B><LI>mtime</B>.....data da última modificação de dados
<B><LI>nlink</B>........número de <I>hard links</I>
<B><LI>size</B>...........tamanho do arquivo, em bytes
<B><LI>type</B>..........Tipo do arquivo
<B><LI>uid</B>.............ID de usuário do dono do arquivo
</UL>
Como o comando chama <B>lstat</B>, se <I>nome</I> é um <I>link simbólico</I>
os valores em <I>nomeVar</I> irão se referir ao link, e não ao arquivo que
está <I>linkado</I>.
<P>
Veja <I>stat</I> também.
<B><DT>file mtime</B> <I>nome</I>
<DD>Retorna a data da última modificação de dados em segundos desde
Jan 1, 1970.
<B><DT>file owned</B> <I>nome</I>
<DD>Retorna 1 se o arquivo é usuário atual é o dono do arquivo. Caso contrário,
retorna 0.
<B><DT>file readable</B> <I>nome</I>
<DD>Retorna 1 se o arquivo pode ser lido pelo usuário atual. Caso contrário,
retorna 0.
<B><DT>file readlink</B> <I>nome</I>
<DD>Retorna o nome do arquivo que um <I>link simbólico</I> está
apontando. Se o <I>nome</I> não é um <I>link simbólico</I>, ou não
pode ser lido, um erro é gerado.
<B><DT>file rootname</B> <I>nome</I>
<DD>Retorna todos os caracteres em <I>nome</I>, mas não incluindo o
último ".". Retorna <I>$nome</I> se <I>nome</I> não inclui um ".".
<B><DT>file size</B> <I>nome</I>
<DD>Retorna o tamanho de <I>nome</I> em bytes.
<B><DT>file stat</B> <I>nome nomeVar</I>
Retorna a mesma informação retornada pela chamada de sistema
<B>stat</B>. Os resultados são colocados no vetor associativo
<I>nomeVar</I>. Os índices em <I>nomeVar</I> são:
<UL COMPACT>
<B><LI>atime</B>.......data do último acesso
<B><LI>ctime</B>.......data da última mudança de status do arquivo
<B><LI>dev</B>...........dispositivo do inode
<B><LI>gid</B>............ID do grupo do arquivo
<B><LI>ino</B>............número do inode
<B><LI>mode</B>.......modo de proteção do inode
<B><LI>mtime</B>.....data da última modificação de dados
<B><LI>nlink</B>........número de <I>hard links</I>
<B><LI>size</B>...........tamanho do arquivo, em bytes
<B><LI>type</B>..........Tipo do arquivo
<B><LI>uid</B>.............ID de usuário do dono do arquivo
</UL>
<B><DT>file tail</B> <I>nome</I>
<DD>Retorna todos os caracteres em <I>nome</I> depois da última
barra. Retorna <I>$nome</I> se <I>nome</I> não contém barras.
<B><DT>file type</B> <I>nome</I>
<DD>Retorna uma string que fornece o tipo do arquivo <I>nome</I>
que pode ser um dos seguintes:
<UL COMPACT>
<B><LI>file</B>...................................Arquivo normal
<B><LI>directory</B>........................Diretório
<B><LI>characterSpecial</B>.......Dispositivo orientado a caracter
<B><LI>blockSpecial</B>.............. Dispositivo orientado a bloco
<B><LI>fifo</B>...................................Pipe nomeado
<B><LI>link</B>..................................Link simbólico
<B><LI>socket.</B>...........................Socket nomeado
</UL>
<B><DT>file writable</B> <I>nome</I>
<DD>Retorna 1 se o arquivo <I>nome</I> pode ser acessado para escrita pelo usuário atual.
Caso contrário, retorna 0.
</DL>
:TEXT_END:

:LESSON_TEXT_START_LEVEL 2:
Há dois comandos que fornecem informação sobre o sistema de arquivos,
<CODE>glob</CODE> e <CODE>file</CODE>.
<P>
<B>Glob</B> fornece o acesso a nomes de arquivos em um diretório.
Ele utiliza um mecanismo de pesquisa de nomes similar ao <B>ls</B>, 
para retornar uma lista dos nomes que são compatíveis com um modelo.
<P>
<B>File</B> fornece dois conjuntos de funcionalidades:
<UL COMPACT> 
<LI>manipulação de string apropriada para o tratamento de
nomes de arquivos:
<UL COMPACT>
<B><LI> dirname </B> ........ Retorna a porção do diretório de cada caminho
<B><LI> extension</B>........ Retorna a extensão do nome do arquivo
<B><LI> rootname</B> ....... Retorna o nome do arquivo sem a extensão
<B><LI> tail</B> .................... Retorna o nome do arquivo sem o diretório
</UL>
<LI> informação sobre uma entrada em um diretório:
<UL COMPACT>
<B><LI> atime</B> ................ Retorna a data do último acesso
<B><LI> executable</B> ..... Retorna 1 se o arquivo é executável pelo usuário
<B><LI> exists</B> ................ Retorna 1 se o arquivo existe
<B><LI> isdirectory</B> ...... Retorna 1 se a entrada é um diretório
<B><LI> isfile</B> .................. Retorna 1 se a entrada é um arquivo regular
<B><LI> lstat</B> ................... Retorna um vetor de informação de status do arquivo
<B><LI> mtime</B> ............... Retorna a data da última modificação de dados
<B><LI> owned</B> ................ Retorna 1 se o arquivo é de propriedade do usuário
<B><LI> readable</B>............ Retorna 1 se o arquivo é pode ser lido pelo usuário
<B><LI> readlink</B>............. Retorna o nome do arquivo apontado pelo <I>link simbólico</I>
<B><LI> size</B> ..................... Retorna o tamanho do arquivo, em bytes
<B><LI> stat</B> ..................... Retorna um vetor de informação de status do arquivo
<B><LI> type</B> .................... Retorna o tipo do arquivo
<B><LI> writable</B> ............ Retorna 1 se o arquivo pode ser acessado para escrita pelo usuário
</UL>
</UL>
Em meio a esses dois comandos, um programa pode obter a maior parte da
informação que ele pode precisar.
<DL>
<B><DT>glob</b> <I>?modificadores? modelo ?modeloN?</I>
<DD>Retorna uma lista dos nomes de arquivos compatíveis com o <I>modelo</I>.
<P>
<I>modificadores</I> podem ser um dos seguintes:
<DL>
<B><DT>-nocomplain</B>
<DD>Permite ao comando <CODE>glob</CODE> retornar uma lista vazia sem
causar um erro. Sem esse indicador, um erro seria gerado quando a
lista vazia fosse retornada.
<B><DT>--</B>
<DD>Indica o fim dos delimitadores. Isso permite o uso de "-" em um modelo
sem confundir o tratador do comando <CODE>glob</CODE>.
</DL>
<P>
<I>modelo</I> segue as mesmas regras de busca da técnica
<I>globbing</I> de <CODE>string match</CODE> com essas
exceções:
<UL>
<B><LI>{a,b,...}</B> Encontra qualquer uma das string a,b, etc.
<LI> Um "." no início de um nome de arquivo deve encontrar um
"." no nome do arquivo. O "." é apenas um <I>wildcard</I> se
ele não for o primeiro caracter em um nome.
<LI>Todas as "/" devem encontrar exatamente as "/".
<LI>Se os primeiros dois caracteres em <I>modelo</I> são <B>~/</B>, então o <B>~</B> é
substituído pelo valor da variável de ambiente <B>HOME</B>.
<LI>Se o primeiro caracter em <I>modelo</I> é um <B>~</B>, seguido por um número
de identificação (id) de login, então o <B>~IDlogin</B> é substituído pelo
caminho do diretório <I>home</I> do usuário que possui o <I>IDlogin</I>.
</UL>
Note que os nomes de arquivos compatíveis com o <I>modelo</I> não estão
ordenados.
<B><DT>file atime</B> <I>nome</I>
<DD>Retorna o número de segundos desde 1/1/1970 quando o arquivo <I>nome</I>
foi acessado pela última vez. Gera um erro se o arquivo não existe, ou
o tempo de acesso não pôde ser consultado.
<B><DT>file dirname</B> <I>nome</I>
<DD>Retorna a porção do diretório de uma string caminho/nomeArquivo. Se <I>nome</I>
não contém barras, <B>file dirname</B> retorna um ".".  Se a última "/"
em <I>nome</I> é também o primeiro caracter, ele retorna uma "/".
<B><DT>file executable</B> <I>nome</I>
<DD>Retorna um 1 se o arquivo <I>nome</I> é executável pelo usuário atual,
caso contrário retorna um 0.
<B><DT>file exists</B> <I>nome</I>
<DD>Retorna um 1 se o arquivo <I>nome</I> existe, e o usuário tem acesso de
pesquisa em todos os diretórios seguintes ao arquivo. Caso contrário, um 0 é retornado.
<B><DT>file extension</B> <I>nome</I>
<DD>Retorna a extensão do arquivo <I>nome</I>.
<B><DT>file isdirectory</B> <I>nome</I>
<DD>Retorna 1 se o arquivo <I>nome</I> é um diretório. Caso contrário retorna 0.
<B><DT>file isfile</B> <I>nome</I>
<DD>Retorna 1 se o arquivo <I>nome</I> é um arquivo regular. Caso contrário retorna 0.
<B><DT>file lstat</B> <I>nome nomeVar</I>
<DD>Retorna a mesma informação retornada pela chamada de sistema 
<B>lstat</B>. Os resultados são colocados no vetor associativo
<I>nomeVar</I>. Os índices em <I>nomeVar</I> são:
<UL COMPACT>
<B><LI>atime</B>.......data do último acesso
<B><LI>ctime</B>.......data da última mudança de status do arquivo
<B><LI>dev</B>...........dispositivo do inode
<B><LI>gid</B>............número de identificação (ID) do grupo ao qual o arquivo pertence
<B><LI>ino</B>............número do inode
<B><LI>mode</B>.......mode de proteção do inode
<B><LI>mtime</B>.....data da última modificação de dados
<B><LI>nlink</B>........número de <I>hard links</I>
<B><LI>size</B>...........tamanho do arquivo, em bytes
<B><LI>type</B>..........Tipo do arquivo
<B><LI>uid</B>.............ID de usuário do dono do arquivo
</UL>
Como o comando chama <B>lstat</B>, se <I>nome</I> é um <I>link simbólico</I>
os valores em <I>nomeVar</I> irão se referir ao link, e não ao arquivo que
está <I>linkado</I>.
<P>
Veja <I>stat</I> também.
<B><DT>file mtime</B> <I>nome</I>
<DD>Retorna a data da última modificação de dados em segundos desde
Jan 1, 1970.
<B><DT>file owned</B> <I>nome</I>
<DD>Retorna 1 se o arquivo é usuário atual é o dono do arquivo. Caso contrário,
retorna 0.
<B><DT>file readable</B> <I>nome</I>
<DD>Retorna 1 se o arquivo pode ser lido pelo usuário atual. Caso contrário,
retorna 0.
<B><DT>file readlink</B> <I>nome</I>
<DD>Retorna o nome do arquivo que um <I>link simbólico</I> está
apontando. Se o <I>nome</I> não é um <I>link simbólico</I>, ou não
pode ser lido, um erro é gerado.
<B><DT>file rootname</B> <I>nome</I>
<DD>Retorna todos os caracteres em <I>nome</I>, mas não incluindo o
último ".". Retorna <I>$nome</I> se <I>nome</I> não inclui um ".".
<B><DT>file size</B> <I>nome</I>
<DD>Retorna o tamanho de <I>nome</I> em bytes.
<B><DT>file stat</B> <I>nome nomeVar</I>
Retorna a mesma informação retornada pela chamada de sistema
<B>stat</B>. Os resultados são colocados no vetor associativo
<I>nomeVar</I>. Os índices em <I>nomeVar</I> são:
<UL COMPACT>
<B><LI>atime</B>.......data do último acesso
<B><LI>ctime</B>.......data da última mudança de status do arquivo
<B><LI>dev</B>...........dispositivo do inode
<B><LI>gid</B>............ID do grupo do arquivo
<B><LI>ino</B>............número do inode
<B><LI>mode</B>.......modo de proteção do inode
<B><LI>mtime</B>.....data da última modificação de dados
<B><LI>nlink</B>........número de <I>hard links</I>
<B><LI>size</B>...........tamanho do arquivo, em bytes
<B><LI>type</B>..........Tipo do arquivo
<B><LI>uid</B>.............ID de usuário do dono do arquivo
</UL>
<B><DT>file tail</B> <I>nome</I>
<DD>Retorna todos os caracteres em <I>nome</I> depois da última
barra. Retorna <I>$nome</I> se <I>nome</I> não contém barras.
<B><DT>file type</B> <I>nome</I>
<DD>Retorna uma string que fornece o tipo do arquivo <I>nome</I>
que pode ser um dos seguintes:
<UL COMPACT>
<B><LI>file</B>...................................Arquivo normal
<B><LI>directory</B>........................Diretório
<B><LI>characterSpecial</B>.......Dispositivo orientado a caracter
<B><LI>blockSpecial</B>.............. Dispositivo orientado a bloco
<B><LI>fifo</B>...................................Pipe nomeado
<B><LI>link</B>..................................Link simbólico
<B><LI>socket.</B>...........................Socket nomeado
</UL>
<B><DT>file writable</B> <I>nome</I>
<DD>Retorna 1 se o arquivo <I>nome</I> pode ser acessado para escrita pelo usuário atual.
Caso contrário, retorna 0.
</DL>
<P>
O exemplo mostra uma forma de usar esses comandos para contruir uma
tabela de nomes de arquivo, diretórios, inodes, e tipos.
<P>
As primeiras duas linhas de código usam o <CODE>glob</CODE> para criar duas
listas (<CODE>ail1, ail2</CODE>) de arquivos. 
<P>
As próximas duas linhas de código usam o comando <CODE>format</CODE> 
para exibir os cabeçalhos das colunas para os dados que irão ser
mostrados pelo restante do código.
A construção <B>%-</B> força esses campos a serem justificados à esquerda,
para aparecerem melhor em uma tabela. Isso não é feito para o terceiro
campo porque aquele campo será o número do inode, e números aparecem melhor
justificados à direita.
<P>
Depois, o programa faz uma repetição em todos os nomes que foram adquiridos
com o comando <CODE>glob</CODE>. <CODE>Concat</CODE> é usado para combinar
as duas listas em uma única lista. Se <CODE>list</CODE> fosse usado, semelhante
a isso:
<PRE>
foreach nome [list $ail1 $ail2]
</PRE>
o comando trataria <B>$ail1</B> e <B>$ail2</B> como entidades únicas, 
e criaria uma lista remontada:
<PRE>
{ail1/file1 ail1/file2} {ail2/file1 ail2/file2}</PRE>
<P>
o que faria com que todos os comandos <CODE>file</CODE> falhassem, 
uma vez que "ail1/file1 ail1/file2" não é o nome de um arquivo.
<P>
O nome do arquivo é dividido em porções de diretório e nome utilizando
os comandos <CODE>file dirname</CODE> e <CODE>file tail</CODE>.
<P>
O comando <CODE>file stat</CODE> é usado para construir um vetor associativo de
vários campos de status para a entrada. O único que nós iremos usar
é o <B>ino</B>, que é o inode do arquivo. Há uma boa chance que exista dois
arquivos exibidos que têm o mesmo inode, mas eles são listados como 
arquivos regulares. Estes são <I>links normais</I>, ao invés de
<I>links simbólicos</I>.
<P>
Os resultados desses comandos são mostrados com um comando puts usando
a opção 'nonewline'. Esta opção desativa a inserção de um caracter de
nova linha após a execução do comando. Neste caso, nós podemos
adicionar um comentário para cada linha de dado depois que ela já
foi impressa.
<P>
Finalmente, se o <B>tipo</B> do <B>$nome</B> for um arquivo, o tamanho é exibido, 
e se o <B>tipo</B> for um <I>link simbólico</I>, então o arquivo ao qual ele
está <I>linkado</I> é exibido.
<P>
Para praticar, tente mudar o diretório, e veja quais os tipos de arquivos são
mostrados.
:TEXT_END:

:CODE_START:
;# Adquire um grupo de arquivos para comparar

set ail1 [glob modelo1]
set ail2 [glob modelo2]

;# Atribui o formato da string (veja a Lição 18), e mostra
;# o cabeçalho das colunas

set fmt "%-12s %-16s %8s %-7s"
puts "[format "$fmt Comentário" "Diretório" "Nome" "Inode" "Tipo"]"

;# Executa um laço através dos nomes dos arquivos colecionados
;# pelo glob, e determina seus inode, tamanho, e tipo.
;# Então exibe os resultados.

foreach nome [concat $ail1 $ail2] {
  ;# Separa o nome em partes para exibir:
  set dir [file dirname $nome]
  set nomeArquivo [file tail $nome]
  
  ;# Coleta alguma informação de status e tipo.
  file stat $nome vetor
  set tipo [file type $nome]

  ;# Mostra o que nós aprendemos
  puts -nonewline "[format $fmt $dir $nomeArquivo $vetor(ino) $tipo]"
  
  ;# e dados particulares dependendo se o item é um arquivo ou link simbólico.

  if {[string match [file type $nome] "link"]} {
      puts " aponta para: [file readlink $nome]"
     }

  if {[string match [file type $nome] "file"]} {
      puts " Tamanho: [file size $nome] bytes"
     }
  }

:TEXT_END: