System.IO Trabalhando com arquivos e estudando pro MCTS
Published: 2020-04-14 12:38:01

**Post publicado originalmente em 31/10/2007 em https://monodel.blogspot.com/**

Estudando para o MCTS...

Botei na cabeça, agora eu vo tirar minha certificação MCSTS...

O grande problema...

Eu moro numa cidade relativamente pequena, logo, aqui não temos centros de treinamento, ou seja, vo ter que estudar sozinho, sou contra a pirataria, mais tem casos que a gente é obrigado, e pra isso nosso bom e velho emule sempre ajuda.

No momento eu to estudando o Trainning Kit 70-536 q é um dos exames que precisam ser feitos pra ser MCTS, e ao longo dos estudos estarei postando coisas que aprendi e que penso em passar pra vcs queridos visitantes:

O primeiro desses tópicos trata do segundo capítulo do livro, que é o namespace System.IO, nesse tópico eu vo explicar mostrar a utilidade de alguns itens desse framework no que tange a utilização de arquivos, criação, abertura, compactação, etc.

Abaixo explicado está um programinha que fiz que lê verifica se um determinado arquivo está no path especificado, mostra o conteúdo do arquivo e permite compactar o arquivo. Nesse pequeno programa vc vai poder aprender, algumas técnicas de compactação q eu achei muito interessante, ótimo pra fazer geradores de backup pros dados do sistema entre zilhões de outras utilidades.

### FileInfo class

A primeira das classes q eu vo abordar trata-se da FileInfo, essa classe encapsula vários métodos para acessar e manipular arquivos. Pra informações detalhadas dessa classe você pode consultar o help do VS, ou no site da MSDN.

As principais propriedades da classe FileInfo são:
Directory: Que retorna um objeto DirectoryInfo da pasta que o arquivo usado FileInfo está armazenado.
DirectoryName: Retorna uma string contendo o nome da pasta que o arquivo está armazenado.
IsReadOnly: Escolhe se o arquivo em questão é Somente Leitura ou não.
Length: Retorna o tamanho do arquivo.

Os principais métodos são esses:
AppendText: Cria um StreamWriter que permite adicionar texto ao arquivo
CopyTo: Copia o arquivo pra um novo local
Create: Cria um novo arquivo baseado nas informações do arquivo aberto pelo FileInfo
CreateText: Cria um novo StreamWriter num arquivo novo e permite adicionar texto
Encrypt: Encripta um arquivo.
Decrypt: Desemcripta um arquivo.
MoveTo: Move o arquivo pra outro local.
Open: abre o arquivo com os privilégios especificados (Read, Write, Read/Write)
OpenRead: Abre o arquivo em somente leitura
OpenText: Abre o arquivo e retorna um StreamReader, para a leitura do arquivo.
OpenWrite: Abre o arquivo com a opção write-only.
Replace: Sobrescreve o arquivo com os dados contidos no FileInfo.

### FileStream

A classe FileStream é muito parecida com a FileInfo, porém ele possui diversas outras funcionalidades que o FileInfo não possui, até porque o objetivo do FileInfo é prover informações sobre um arquivo e não manipula-lo, o FileStream já é o contrário o seu objetivo é justamente representar um arquivo.

Ai vai as principais propriedades dele:
CanRead: Determina se o arquivo poder ser lido.
CanSeek: Determina se o arquivo pode sofrer procura.
CanTimeOut: Determina se o arquivo possui um tempo pra expirar.
CanWrite: Determina se o arquivo pode ser escrito.
Lenght: Retorna o tamanho do arquivo
Name: Retorna o nome do arquivo.
Position: Retorna a posição do cursor virtual dentro do arquivo.
ReadTimeOut: Tempo para expirar a leitura
WriteTimeOut:Tempo para expirar a escrita

Principais métodos:
Close: Fecha o arquivo
Flush: Limpa o buffer e envia qualquer alteração para o arquivo.
Lock: Trava o arquivo para que outros processos não interfiram.
Read: Faz uma leitura sequencial, começando da posição atual do cursos virtual até o valor de bytes informado.
ReadByte: Le apenas um byte
Seek: Seta a posição do cursos virtual baseado num parametro fornecido
SetLegth: Seta o tamanho do FileStram
Unlock: Destrava o arquivo
Write: Escreve uma quantidade especificada de bytes no FileStream
WriteByte: Escreve um unico byte no arquivo

### StreamReader

O StreamReader é uma classe que provê todas as funções necessárias para ler os dados contidos dentro de um Stream (FileStream, MemoryStream, ...)

Principais propriedades:
EndOfStream: Retorna se o Stream a que o StreamReader está manipulando chegou ao final.

Principais métodos:
Close: Fechar o StreamReader
Peek: Retorna o proximo caracter do stream sem reposicionar o cursor.
Read: Le uma quantidade especificada de caracteres do stream
ReadBlock: Le um um bloco de caracteres do stream
ReadLine: Lê uma linha de caracteres do stream
ReadToEnd: Lê todos os caracteres desde a posição atual do cursor virtual até o fim do arquivo.

### StreamWriter

Além do StreamReader que tem a função de lê os dados de um Stream, ainda temos o StreamWriter, que tem a função oposta, provê todos os recursos necessários para a escrita de danos no stream.

Principais propriedades:
AutoFlush: Determina se a cada chamada do método Write, um Flush também é chamado para enviar os dados ao arquivo.

Principais métodos:
Close: Fecha o StreamWriter e envia os dados para o arquivo.
Write: Escreve dados especificados no stream.
WriteLine: Escreve uma linha inteira no arquivo.

### GZipStream

Ainda temos o GZipStream, que provê todos os recursos necessários para a compressão e descompressão de dados. O GZipStream usa um algoritmo de compressão de dados aberto e livre de patentes, além do GZip, ainda temos o Deflate, que usa o mesmo algoritmo do GZip, então qual eu escolho na hora q precisar?

O GZip possui a diferença de armazenar dados específicos no cabeçalho que permite que outras ferramentas possam abrir esse arquivo, já o Deflate, omite esses dados, então se vc precisa criar um formato que poder ser aberto em qualquer programa de compactação use o GZip, se vc precisa de um formato que só o seu programa abra, use o Deflate, o uso deles dentro do programa não muda em absolutamente nada, só muda a declaração da variável Stream que para o GZip é GZipStream MyCom e pro Deflate é DeflateStream MyCom, o resto é tudo igual.

Principais propriedades do GZipStream:
Possui as mesmas propriedades dos Demais Stream's;

Principais métodos:
Possui os mesmos métodos dos Demais Stream's;

**E agora como usa isso tudo???**


Aqui vai o programinha que eu fiz pra manipular todos esses recursos que tentei explicar anteriormente.

Ai vai a listagem completa:

```csharp
static void Main (string[] args) {
    ConsoleKeyInfo Tecla = new ConsoleKeyInfo ();
    while (Tecla.KeyChar.ToString ().ToUpper () != "N") {
        Console.Write ("Que arquivo deseja procurar? ");
        string Arquivo = Console.ReadLine ();
        FileInfo MyFile = new FileInfo (Arquivo);
        if (MyFile.Exists) {
            Console.WriteLine ("Nome do arquivo: {0}", MyFile.Name);
            Console.WriteLine ("Path: {0}", MyFile.FullName);
            Console.WriteLine ();
            Console.Write ("Visualizar o arquivo (S/N)? ");
            ConsoleKeyInfo Tecla1 = Console.ReadKey ();
            if (Tecla1.KeyChar.ToString ().ToUpper () == "S") {
                FileStream VArquivo = File.Open (MyFile.FullName, FileMode.Open, FileAccess.Read);
                FileStream ArqDestino = File.Create (MyFile.FullName + ".gz");
                StreamReader VArqStreamReader = new StreamReader (VArquivo);
                Console.WriteLine (VArqStreamReader.ReadToEnd ());

                Console.Write ("Deseja comprimir o arquivo (S/N) ? ");
                ConsoleKeyInfo Tecla2 = Console.ReadKey ();
                if (Tecla2.KeyChar.ToString ().ToUpper () == "S") {
                    GZipStream CompArq = new GZipStream (ArqDestino, CompressionMode.Compress);
                    VArquivo.Position = 0;
                    int theByte = VArquivo.ReadByte ();
                    while (theByte != -1) {
                        CompArq.WriteByte ((byte) theByte);
                        theByte = VArquivo.ReadByte ();
                    }
                    CompArq.Close ();
                    VArqStreamReader.Close ();
                    VArquivo.Close ();
                } else
                    Console.WriteLine ();
            } else
                Console.WriteLine ();
        } else {
            Console.WriteLine ("Arquivo não encontrado...");
        }

        Console.Write ("Deseja analisar outro arquivo (S/N) ? ");
        Tecla = Console.ReadKey ();
    }
}
```

Espero que dê pra entender tudo que tentei passar...

Qualquer dúvida pode falar comigo pelo msn: gardel@gardelsouza.net

A proposito não esqueça de adicionar os namespaces:
System.IO;
System.IO.Compression;


É isso ai até a próxima.