sexta-feira, 24 de outubro de 2008

Bash Script: Convertendo vcf para txt (vcf2txt 0.2)

Certo dia estava precisando converter arquivos VSF (formato utilizado para troca de contatos entre programas e mesmo entre dispositivos) em arquivos TXT e acabei por escrever o script abaixo. Eu diria que o mesmo se encontra em uma versão beta, pois ainda não possui todas as funcionalidades que eu gostaria que ele tivesse, mas fica ai como uma primeira versão e mesmo como um gancho para outras criações.

Um detalhe importante, é preciso antes de executar o mesmo, modificar as variáveis ARQUIVOENTRADA, ARQUIVOSAIDA e ARQUIVOSAIDATAB, inserindo nos locais indicados o nome dos arquivos de entrada e de saída. Ah sim, também é importante não esquecer de ao salvar o script mudar a sua permissão para permitir execução :D

Para baixar o arquivo diretamente para sua máquina, acesse o endereço: http://hailtales.googlepages.com/vsf2txt.sh.gz

#!/bin/bash
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# EDITE AQUI
# ARQUIVO VSF ENTRADA
ARQUIVOENTRADA="/home/usuario/entrada.vcf"
# ARQUIVO DE SAIDA SIMPLES
ARQUIVOSAIDA="/home/usuario/saida.txt"
# ARQUIVO DE SAIDA TABULADO
ARQUIVOSAIDATAB="/home/usuario/saida.tab"
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
########################################
# VSF 2 TXT
# por Tales de Azevedo - 23/03/2008
# hailtales@gmail.com
# http://hailtales.blogspot.com
#
# Este programa é software livre; você pode redistribui-lo e/ou modificá-lo sob
# os termos da Licença Pública Geral GNU, conforme publicada pela Free Software
# Foundation; tanto a versço 2 da Licença como (a seu critério) qualquer versão
# mais actual.
#
# Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
# GARANTIA; incluindo as garantias implícitas de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
# A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
# obter mais detalhes.
########################################
INICIO=0
SEPARADOR=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
# caso já exista um arquivo de saída, ele será sobrescrito
rm ${ARQUIVOSAIDA}
# funcao que evita a impressao de lixo nos logs de saida
ZERAVAR()
{
NOME=" "
CEL=" "
CASA=" "
TRAMPO=" "
EMAIL=" "
ANI=" "
}
# log da saida normal
LOGSAIDA()
{
# Escreve o arquivo de saída
echo ${NOME} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDA}
printf "\t\t" >> ${ARQUIVOSAIDA}
# Escreve o arquivo de saída
echo ${CEL} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDA}
printf "\t" >> ${ARQUIVOSAIDA}
# Escreve o arquivo de saída
echo ${CASA} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDA}
printf "\t" >> ${ARQUIVOSAIDA}
# Escreve o arquivo de saída
echo ${TRAMPO} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDA}
printf "\t" >> ${ARQUIVOSAIDA}
# Escreve o arquivo de saída
echo ${EMAIL} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDA}
printf "\t" >> ${ARQUIVOSAIDA}
# Escreve o arquivo de saída
echo ${ANI} | tr -s '[:cntrl:]' ' ' >> ${ARQUIVOSAIDA}
printf "\n" >> ${ARQUIVOSAIDA}
}
# log de saida tabelado
LOGSAIDATAB()
{
# Escreve o arquivo de saída
echo ${NOME} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDATAB}
printf ":" >> ${ARQUIVOSAIDATAB}
# Escreve o arquivo de saída
echo ${CEL} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDATAB}
printf ":" >> ${ARQUIVOSAIDATAB}
# Escreve o arquivo de saída
echo ${CASA} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDATAB}
printf ":" >> ${ARQUIVOSAIDATAB}
# Escreve o arquivo de saída
echo ${TRAMPO} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDATAB}
printf ":" >> ${ARQUIVOSAIDATAB}
# Escreve o arquivo de saída
echo ${EMAIL} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDATAB}
printf ":" >> ${ARQUIVOSAIDATAB}
# Escreve o arquivo de saída
echo ${ANI} | tr -s '[:cntrl:]' ' ' >> ${ARQUIVOSAIDATAB}
printf "\n" >> ${ARQUIVOSAIDATAB}
}

clear
export INICIO


# lendo arquivo entrada
cat ${ARQUIVOENTRADA} |
while read CAMPO
do
if [[ "${CAMPO}" =~ "BEGIN" ]]
then
# Define o inicio de um registro
INICIO=1
ZERAVAR
echo "${SEPARADOR}"
elif [[ "${CAMPO}" =~ "END" ]]
then
# Define o fim de um registro
INICIO=0
LOGSAIDATAB
LOGSAIDA
elif [ "${INICIO}" -eq "1" ]
then
# Procura pelo campo nome do contato (name)
if [[ "${CAMPO}" =~ "N:" ]]
then
# Essa rotina garante que nome (name) nao sera confundido com versao
if [[ "${CAMPO}" =~ "VERSION:" ]]
then
:
else
NOME=`echo ${CAMPO}|cut -d : -f 2 | cut -d ";" -f 2`
echo ${NOME}
fi
# Procurando pelo endereco (address)
elif [[ "${CAMPO}" =~ "ADR;" ]]
then
ENDERECO=`echo ${CAMPO}|cut -d : -f 2 | tr ";" " " `
echo "O endereço é ${ENDERECO}"
# Procurando os numeros de telefone (phone numbers) e separando em categorias
elif [[ "${CAMPO}" =~ "TEL;" ]]
then
if [[ "${CAMPO}" =~ "CELL" ]]
then
CEL=`echo ${CAMPO}|cut -d : -f 2`
echo "O telefone celular é ${CEL}"
elif [[ "${CAMPO}" =~ "HOME" ]]
then
CASA=`echo ${CAMPO}|cut -d : -f 2`
echo "O telefone residencial é ${CASA}"
elif [[ "${CAMPO}" =~ "WORK" ]]
then
TRAMPO=`echo ${CAMPO}|cut -d : -f 2`
echo "O telefone profissional é ${TRAMPO}"
else
TOUTRO=`echo ${CAMPO}|cut -d : -f 2`
echo "Outro telefone: ${TOUTRO}"
fi
# Procurando pelo endereco de correio eletronico (e-mail)
elif [[ "${CAMPO}" =~ "EMAIL;" ]]
then
EMAIL=`echo ${CAMPO}|cut -d : -f 2`
echo "O e-mail é ${EMAIL}"
# Caso o contato possua um site
elif [[ "${CAMPO}" =~ "URL;" ]]
then
echo "O site é ${CAMPO}"
# Aniversario do contato (birthday)
elif [[ "${CAMPO}" =~ "BDAY:" ]]
then
ANI=`echo ${CAMPO}|cut -d : -f 2`
echo "O aniversário é ${ANI}"
else
:
fi
else
:
fi
done

Atualizado:
Eis abaixo a versão 0.2 do script de conversão de arquivos vcf para txt escrito em shell script. Basicamente as mudanças nessa versão são:
  • Função unificada para geração do arquivo de saída;
  • Função de organização da saída;
  • Reconhecimento de nomes com especificação de charset;
  • Reconhecimento do campo de sobrenome;

Para baixar o arquivo basta clicar aqui.

Abaixo o código para consulta:

#!/bin/bash

# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# EDITE AQUI

# ARQUIVO VSF ENTRADA
ARQUIVOENTRADA="/home/tales/All.vcf"

# ARQUIVO DE SAIDA
ARQUIVOSAIDA="/home/tales/saida.txt"

# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

########################################
# VSF 2 TXT
# por Tales de Azevedo - 23/03/2008
# hailtales@gmail.com
# http://hailtales.blogspot.com
#
# Este programa é software livre; você pode redistribui-lo e/ou modificá-lo sob
# os termos da Licença Pública Geral GNU, conforme publicada pela Free Software
# Foundation; tanto a versço 2 da Licença como (a seu critério) qualquer versão
# mais actual.
#
# Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
# GARANTIA; incluindo as garantias implícitas de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
# A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
# obter mais detalhes.
########################################

INICIO=0
SEPARADOR=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
# caso já exista um arquivo de saída, ele será sobrescrito
rm ${ARQUIVOSAIDA}

# funcao que evita a impressao de lixo nos logs de saida
ZERAVAR()
{

NOME=" "
CEL=" "
CASA=" "
TRAMPO=" "
EMAIL=" "
ANI=" "

}
LOGSAIDA()
{
#TAB=\t
TAB=":"
TABFIM=\n
# Escreve o arquivo de saída
echo ${NOME} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDA}
printf "${TAB}${TAB}" >> ${ARQUIVOSAIDA}

# Escreve o arquivo de saída
echo ${CEL} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDA}
printf "${TAB}" >> ${ARQUIVOSAIDA}

# Escreve o arquivo de saída
echo ${CASA} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDA}
printf "${TAB}" >> ${ARQUIVOSAIDA}

# Escreve o arquivo de saída
echo ${TRAMPO} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDA}
printf "${TAB}" >> ${ARQUIVOSAIDA}

# Escreve o arquivo de saída
echo ${EMAIL} | tr -s '[:cntrl:]' '\000' >> ${ARQUIVOSAIDA}
printf "${TAB}" >> ${ARQUIVOSAIDA}

# Escreve o arquivo de saída
echo ${ANI} | tr -s '[:cntrl:]' ' ' >> ${ARQUIVOSAIDA}
printf "\n" >> ${ARQUIVOSAIDA}

}

ORGANIZA()
{
# Organiza o arquivo final em ordem alfabética
mv ${ARQUIVOSAIDA} ${ARQUIVOSAIDA}.tmp
sort ${ARQUIVOSAIDA}.tmp > ${ARQUIVOSAIDA}

}

clear
export INICIO



# lendo arquivo entrada
cat ${ARQUIVOENTRADA} |
while read CAMPO
do
#echo "DEBUG - CAMPO = $CAMPO"
if [[ "${CAMPO}" =~ "BEGIN" ]]
then
# Define o inicio de um registro
INICIO=1
ZERAVAR
echo "${SEPARADOR}"
elif [[ "${CAMPO}" =~ "END" ]]
then
# Define o fim de um registro
INICIO=0
LOGSAIDA
elif [ "${INICIO}" -eq "1" ]
then
# Procura pelo campo nome do contato (name)
if [[ "${CAMPO}" =~ "N:" ]]
then
# Essa rotina garante que nome (name) nao sera confundido com versao
if [[ "${CAMPO}" =~ "VERSION:" ]]
then
:
else
NOME=`echo ${CAMPO}|cut -d : -f 2 | cut -d ";" -f 2`
SNOME=`echo ${CAMPO}|cut -d : -f 2 | cut -d ";" -f 1`
NOME="${NOME} ${SNOME}"
echo ${NOME}
fi
# Procurando pelo nome com charset (name)
elif [[ "${CAMPO}" =~ "N;CHARSET=ISO-8859-1:" ]]
then
NOME=`echo ${CAMPO}|cut -d : -f 2 | tr ";" " " `
echo "${NOME}"
# Procurando pelo endereco (address)
elif [[ "${CAMPO}" =~ "ADR;" ]]
then
ENDERECO=`echo ${CAMPO}|cut -d : -f 2 | tr ";" " " `
echo "O endereço é ${ENDERECO}"
# Procurando os numeros de telefone (phone numbers) e separando em categorias
elif [[ "${CAMPO}" =~ "TEL;" ]]
then
if [[ "${CAMPO}" =~ "CELL" ]]
then
CEL=`echo ${CAMPO}|cut -d : -f 2`
echo "O telefone celular é ${CEL}"
elif [[ "${CAMPO}" =~ "HOME" ]]
then
CASA=`echo ${CAMPO}|cut -d : -f 2`
echo "O telefone residencial é ${CASA}"
elif [[ "${CAMPO}" =~ "WORK" ]]
then
TRAMPO=`echo ${CAMPO}|cut -d : -f 2`
echo "O telefone profissional é ${TRAMPO}"
else
TOUTRO=`echo ${CAMPO}|cut -d : -f 2`
echo "Outro telefone: ${TOUTRO}"
fi
# Procurando pelo endereco de correio eletronico (e-mail)
elif [[ "${CAMPO}" =~ "EMAIL;" ]]
then
EMAIL=`echo ${CAMPO}|cut -d : -f 2`
echo "O e-mail é ${EMAIL}"
# Caso o contato possua um site
elif [[ "${CAMPO}" =~ "URL;" ]]
then
echo "O site é ${CAMPO}"
# Aniversario do contato (birthday)
elif [[ "${CAMPO}" =~ "BDAY:" ]]
then
ANI=`echo ${CAMPO}|cut -d : -f 2`
echo "O aniversário é ${ANI}"
else
:
fi
else
:
fi
done
ORGANIZA

quinta-feira, 16 de outubro de 2008

E a contagem regressiva para o lançamento do Ubuntu 8.10 continua...

E embora a data oficial seja dia 30 de outubro, já é possível baixar a última versão beta para já se habituar às características da nova versão. Falando nessas características, a maior parte delas diz respeito exclusivamente a atualização de pacotes, alguns muito importantes como a do Kernel, que agora passa a ser o 2.6.27 e a do Network Manager, que agora na versão 0.7 passa a suportar conexões 3G, múltiplas dispositivos ativos, roteamento, etc. Apesar de tudo acho que a maior inovação da versão 8.10 é o suporte ao DKMS.

Para quem não conhece, DKMS é a sigla de Dynamic Kernel Module Support, um projeto encabeçado pela Dell Computadores para facilitar aos fabricantes de hardware o desenvolvimento de drivers para Linux, de modo que estes (os fabricantes) não precisem gerar uma nova versão de um determinado driver para cada nova versão do kernel ou para cada distribuição diferentes, facilitando assim tanto a vida deste quanto a do usuário. Na modesta opinião deste que vos escreve, esse suporte já deveria ter sido incluído na versão 8.04 LTS, mas é aquilo ao menos a Canonical resolveu esta pendência na versão seguinte.

Um detalhe que me preocupa, e que sinceramente me proporciona várias dores de cabeça no 8.04 LTS e que infelizmente não vi qualquer menção no 8.10, é com relação ao pulseaudio, o proxy de áudio incluído na última versão. Pessoalmente acho ele bugado, pesado e completamente desnecessário para 95% dos usuários. Já tentei, de várias maneiras, entender o por quê da inclusão do mesmo em uma versão LTS, mas sinceramente não entendi. Espero que a versão incluída no 8.10 esteja melhor otimizada ao sistema do que na versão anterior.

É isso, de qualquer maneira agora só nos resta esperar por mais 13 dias para ver o que futuro o Time do Ubuntu nos reserva…

quarta-feira, 8 de outubro de 2008

Organização de Computadores: Evolução nos Sistemas de Arquivos em Sistemas Microsoft

Hoje em dia quando pensamos em evolução dos computadores pessoais ou pensamos em matéria de desempenho desses computadores, comumente somos inclinados a lembrar unicamente da história e evolução dos microprocessadores. Claro, é impossível conceber a existência dessas máquinas sem esse componente que por tantas vezes é chamado de cérebro do computador.

É preciso porém lembrar que tal como é impossível o computador existir sem o seu microprocessador, é impossível que este venha a ter alguma utilidade sem outros componentes do atual microcomputador. Alguns possuem utilidade – e mesmo necessidade de existência – duvidosa, como por exemplo, mouses, caixas de som, webcams, etc. Outros porém estão intrinsecamente associados ao processador, trabalhando em conjunto com este e permitindo uma real utilização pelo humano sentado a sua frente. Nessa categoria podemos incluir a placa mão, chipset, memórias, barramentos, etc. Apesar de algumas vezes lembrados, raramente esses dispositivos são incluídos na história da evolução dos computadores.

Não só do lado físico – hardware – é feito o computador, precisamos também nos recordar do lado lógico – software. Neste caso, a evolução do computador passa a ser contada pela evolução do sistema operacional instalado na máquina ou de algum aplicativo instalado no computador. É comum ouvirmos coisas como eu agora estou usando o XP, ou você ainda usa 98, ou isso é da época do DOS! Sem dúvida, cada um desses sistemas possuiu sua época e de certa maneira acabou por balizar aquele determinado momento da história da microinformática, porém assim como falamos microprocessador e sua super-exaltação em depreciação a outros componentes de hardware, é fato que o sistema operacional acaba muitas vezes superexaltado em relação ao resto do software.

No caso, este trabalho visa falar sobre um componente de software que atua pode debaixo do todo poderoso sistema operacional, e que cujo desenvolvimento de um estar aparentemente atrelado ao outro, estes acabam por ser peças distintas que atuam em conjunto possibilitando o uso e funcionamento do microcomputador. Este trabalho tratará sobre a evolução dos sistemas de arquivos, ou file systems em inglês. Como este é um assunto que engloba uma infinidade de sistemas uma infinidade de arquiteturas, eu optei por focar na história da evolução dos sitemas de arquivos nos IBM PCs.

Antes de tudo é preciso entender do que se trata o sistema de arquivos. Imaginemos um armário, dentro de um escritório, dotado de várias divisões. Em uma divisão os funcionários deveriam guardar todos os documentos do cliente A, em outra os documentos do cliente B, em outra do cliente C e assim sucessivamente. Agora suponhamos que o armário tenha sido colocado sem qualquer identificação sobre qual divisão é para qual cliente, e que os funcionários não tenham tempo de verificar os documentos salvos em cada divisão para saber qual é a divisão de cada cliente, e que por fim cada funcionário acabe armazenando os documentos na divisão que lhe parecer mais conveniente. Imagine também que alguns funcionários optem por guardar os documentos de cabeça para baixo, enquanto outros preferem guardar de lado e outros prefiram guardar os documentos em pé. Enfim, no final das contas, o armário se tornaria uma bagunça e ninguém seria capaz de encontrar qualquer documento.

Pois bem, esse armário imaginário do qual falei pode ser entendido como uma mídia, um disco rígido, por exemplo, que será aquele local onde as informações serão armazenadas. As divisões existentes são as divisões físicas, presentes na mídia, no nosso caso um disco rígido, na qual encontramos cabeças, setores e trilhas. O sistema de arquivos é o componente que irá organizar essas divisões, permitindo ao sistema operacional, e conseqüentemente aos seus aplicativos, acessar o disco, gravar informações e recuperá-las, assim como permitirá que caso a mídia se transferida para um outro sistema operacional, este possa recuperar as informações salvas pelo primeiro.

Um dos sistemas de arquivos mais, podemos dizer, clássicos do mundo dos microcomputadores, mais especificamente do mundo dos PCs, é a partição FAT. Hoje em desuso nos grandes discos rígidos, a mesma ainda é bastante encontrada em dispositivos móveis e portáteis, como por exemplo, cartões de memória, pendrives e etc. Sua história começa em 1977, com seu desenvolvimento pela Microsoft, mais especificamente por Marc McDonals, um dos primeiros funcionários da firma, para ser utilizado como sistema de arquivo para o Microsoft Basic. Em 1980, com o lançamento do Xenix - uma versão do Unix licenciada e desenvolvida pela Microsoft para uso em microcomputadores baseados em processadores Intel e Zilog – o FAT começou a ser utilizado para produção em sistemas operacionais, mas foi apenas em 1981, com o lançamento do primeiro IBM Pc dotado do MS DOS, o FAT 12 (ou apenas FAT) passou a ser utilizado como sistema de arquivo efetivo do sistema operacional. A receptividade foi tamanha que mais tarde fora portado para outros sistemas compatíveis, como o DR-DOS.

O funcionamento do FAT é bem simples. O disco rígido, na verdade a partição, como um todo é divido em pequenos segmentos, endereçados por palavras de 12 bits. Esse tamanho permitia a indexação de 4096 clusters, gerando partições de no máximo 12 MB, o que numa época onde os HDs de 5 MB eram o topo, 12 MB eram mais que o suficiente. Cada cluster acabava por possuir um tamanho aproximado de 2 a 4 KB, o arquivo era então escrito em um cluster e caso seu tamanho fosse maior ele era dividido e escrito em um número X de clusters.

Organizada a escrita dos arquivos, era preciso indexar os mesmos de modo a permitir a futura leitura. Para tal, era escrita no início do disco, em uma área chamada File Alocation Table – daí o nome FAT - ou Tabela de Alocação de Arquivos, uma espécie de índice do disco, indicando o nome do arquivo – escrito em ASCII, onde cada letra ocupa 1 byte e com um tamanho máximo de 11 caracteres, sendo 8 para nome e 3 para extensão, seus atributos e seus clusters. Esse sistema possuía a opção de salvar 4 atributos para cada arquivo, que poderiam ser: oculto, se o mesmo seria listado ao se efetuar um open, somente leitura, se permitiria operações de delete e write, e sistema, semelhante a somente leitura Essa tabela era armazenada logo no início da partição, ocupando grandiosos 16KB, o que permitia a manipulação de 512 arquivos salvos em cada partição.

Esse formato de organização de acesso aos arquivos utilizado pelo FAT, gerou determinados problemas e características do sistema, que merecem ser apontadas:

A primeira é com relação ao uso de do disco por cada arquivo. Como foi dito, cada arquivo obrigatoriamente precisa estar armazenado dentro de um cluster de, por exemplo, 4KB. Portanto caso seja salvo um arquivo de texto com apenas uma palavra dentro, o que não ocuparia mais de 20 bytes, ao ser salvo em uma mídia em FAT, ele passaria a ocupar 4KB, ou seja, o cluster inteiro. Em mídias com clusters altos de 32KB e muitos arquivos de tamanho diminuto, isso acaba por gerar um tremendo desperdício de disco.

O segundo problema encontrado no acesso FAT é com relação a gravação, pois com o apagar e escrita de arquivos, o sistema acaba obrigado a escrever os arquivos em clusters não seqüenciais. Teoricamente isso não geraria qualquer problema, pois todos os clusters contendo o arquivo estariam descritos dentro da tabela FAT, porém ao se realizar essa leitura na prática, o que acaba ocorrendo é um substancial aumento no tempo necessário para se realizar essa leitura, o que prejudicava muito o desempenho dos microcomputadores na época.

Por fim o terceiro dos problemas graves era com relação ao acesso ao disco. Na FAT os arquivos eram escritos diretamente, sem qualquer controle, portanto em caso de pane elétrica, os arquivos acabavam corrompidos ou os clusters acabavam inutilizados, por conterem informações de dados mal organizados na tabela FAT.

Não demorou muito e discos de maior capacidade começaram a aparecer e a Microsoft foi obrigada a atualizar seu sistema de arquivos. Foi então em 1984 com o lançamento do MS-DOS 3.0 que veio o FAT 16, uma evolução do FAT 12 que trazia poucas mudanças, como o aumento do endereçamento de 12 para 16 bits, o que permitia o uso de clusters de até 32KB, o que consequentemente permitindo, portanto partições de até 2GB, uma marca impressionante para época. Outra inovação foi a inclusão de um novo atributo diretório aos arquivos, que servia para indicar que aquele arquivo em questão era um diretório. Essa é uma característica interessante dessa versão do FAT, que é a importação de um conceito muito comum dos sistemas Posix, e que nas versões posteriores dos sistemas operacionais da Microsoft foi sendo camuflada, que é a de que para o sistema operacional tudo é um arquivo: diretórios, dispositivos, arquivos em si, tudo no fim acaba sendo tratado como um arquivo.

A inclusão do atributo diretório permitiu aos usuários contornar a limitação dos 512 arquivos, pois embora o tamanho da FAT ainda se mantivesse com os 16KB para os arquivos salvos na raiz do disco, eles agora poderiam criar diretório e salvar os seus arquivos dentro destes.

Como curiosidade, vale se notar que foi nesse nessa versão do MS-Dos que os disquetes de 5 ¼” de polegada passaram a ser suportados. Outro detalhe é que das mudanças mostradas até então do FAT 12 para FAT 16 só foram efetivadas em 1988, com o MS-DOS 4, que seguiu algumas modificações efetuadas pela Compaq em seu DOS 3.31, em 1987. Foi nesse ano que a parceria IBM e Microsoft para o desenvolvimento do OS/2 se iniciou, marcando o fim da parceria com a AT&T e o fim do Xenix.

O desenvolvimento do OS/2 trouxe garantidos avanços ao desenvolvimento dos sistemas de arquivos, com o HPFS, um sistema de arquivos inovador na época para o mundo dos PCs, pois trazia conceitos utilizados em sistemas UNIX como a organização de arquivos em diretórios através de árvores binárias - ao invés de tabelas, como no caso do FAT, além de acabar com o limite de 512 arquivos na raiz da partição; uso de palavras de 32 bits para indexação dos clusters – o que permitia o uso de partições maiores que os 2 GB do FAT16, podendo chegar a até 2 TB; suporte a nomes de arquivo de até 255 caracteres em UNICODE - que apesar de ocupar 2 bytes por digito permitia a inclusão de caracteres não-ocidentais.

Uma das falhas do HPFS fora com relação ao licenciamento do mesmo. Apesar de inicialmente ter sido desenvolvido em conjunto pela IBM com a Microsoft, cada empresa tomou para si rumos distintos para o seu desenvolvimento, surgindo com isso o HPFS Standard, da IBM, e o HPFS386, da Microsoft. Com por questões contratuais as especificações do padrão eram fechadas, nenhum outro desenvolvedor poderia utilizar as inovações de um ou de outro sem o pagamento dos devidos direitos.

Em paralelo ao desenvolvimento do OS/2, a Microsoft continuava com o desenvolvimento do seu MS-DOS e posteriormente do seu MS-Windows, ambos baseados no sistema de arquivos FAT16. Esse padrão perdurou até metade dos anos 90, quando a parceria Microsoft com IBM para o desenvolvimento do OS/2 findou e a ela então lançou Microsoft Windows 95. Nessa época muito dos clientes já estavam acostumados com os vantagens trazidas pelo HPFS, como o nome dos arquivos, tamanho de discos, etc. Por esta razão a Microsoft fora obrigada a implantar um novo especificação do FAT16, dessa vez chamada FAT32 ou vFAT.

Essa nova versão trazia apenas duas inovações em relação a versão 16. A primeira, óbvia é a utilização de palavras de 32 bits para indexação dos clusters do disco rígido, o que permitia a indexação de até 2TB utilizando clusters de 32KB ou 2 GB, como a versão anterior, porém com clusters de 8KB. Fora isso, a outra vantagem era com relação ao nome dos arquivos, que continuavam a possuir o nome de 11 caracteres, porém com um campo dentro da FAT, que apontava para uma segunda tabela, onde era salvo um segundo nome para o arquivo, onde este poderia vir a possuir até 255 caracteres. Esse uso de uma segunda tabela, foi feito para permitir a compatibilidade de discos entre ambos os sistemas, e para permitir a execução do Prompt do MS-DOS e do Modo DOS, no Windows 95.

Um detalhe interessante a se destacar é que apesar dos anos e apesar das suas novas implementações, os problemas destacados ao se falar do FAT 12 persistiram até então. Em decorrência disso, já em finais dos anos 80, a Microsoft, já temerosa pelo seu acordo com a IBM e o futuro do HPSF, passou a trabalhar em um novo projeto de sistema operacional e em um novo sistema de arquivos, o NTFS, lançado oficialmente em 1993.

Muito do desenvolvimento do NTFS ocorreu devido a experiência adquirida pela Microsoft com o desenvolvimento do HPFS. Alguns autores inclusive chegando a colocar o NTFS como sendo uma solução híbrida deste com o FAT, pois nele encontramos o uso do antigo conceito de tabelas e clusters associado ao uso de árvores binárias. A tabela utilizada pelo NTFS não mais utilizava era chamada de a FAT e MTF, sigla de Master File Table, ou Tabela Mestre de Arquivo, e seu uso se resumia a ligar nome de arquivos a seus respectivos metadados, onde são salvas as informações relevantes como uso de disco, atributos, etc. A indexação de arquivos agora era 64 bits, de modo a permitir partições com até 18000000000000000000 de clusters, de modo a permitir o longo uso do sistema de arquivos. Os atributos de arquivos salvos permitiam uma melhor hierarquização do sistema, outra herança do sistemas unix, com cada arquivo possuindo um dono e um grupo, com permissões diferentes de escrita, leitura e execução. Por fim a implementação d o LFS ou Log File Service, como permitia o acesso controlado de escrita ao disco, de modo a evitar a corrupção de dados em caso de pane elétrica.

O NTFS foi sendo continuamente atualizado pela Microsoft, em suas versões do Windows NT, Services Packs. Em finais do século XX, com o lançamento do Windows 2000, foi lançada a versão 5, com suporte mais robusto a criptografia, arquivos sombras e outras inovações. A última versão do NTFS é a 6, utilizada atualmente apenas pelo Windows Vista, que introduziu o conceito de NTFS Transacional, que garantir uma melhor confiabilidade contra falhas físicas. Infelizmente a estrutura de funcionamento do NTFS 5 é mantida em sigilo pela Microsoft e muito do que hoje se sabe foi obtido a partir de engenharia reversa.

Hoje o sistema de arquivos NTFS é predominante no mundo dos PCs domésticos (notebooks, desktops, etc), principalmente devido ao sucesso da versão XP do Ms-Windows, que popularizou este formato. O sistema FAT porém não foi abolido, pois o fato de ser apesar de tudo um sistema aberto, permite que a muitos fabricante o seu suporte sem pagamento de royaltes, consequentemente é um sistema “universal” que pode ser lido em praticamente qualquer sistema operacional.

No mundo dos aparelhos móveis, muitos sistemas operacionais como PalmOS, Symbian e Windows Móbile ainda trabalham com sistemas em FAT, devido a baixa necessidade de confiabilidade e facilidade na implementação garantem esse uso. Recentemente a Microsoft lançou uma nova versão do sistema, chamada exFAT, para uso em aplicações embarcadas com Windows CE, porém suas vantagens somadas ao pouco conhecimento dos desenvolvedores com relação ao seu funcionamento, também sigiloso, e a incompatibilidade com o sistema antigo, faz com que o sistema venha a ser pouco utilizado.

É preciso ressaltar que todo o histórico mostrado neste trabalho tem como foco apenas o ambiente dos PCs descendentes do clássico IBM PC. Olhando para o mercado doméstico como um todo hoje, temos microcomputadores rodando sistemas Linux, BSD, BeOS, Maços entre vários outros sistemas operacionais, que trazem consigo outro sistemas de arquivos com suas próprias características e história.