De que se trata o artigo: O artigo apresenta as classes que o .NET framework possui para realizarmos manipulação de arquivos gravados no sistema operacional ou arquivos/informações alocados na memória do computador, utilizando práticas que podem melhorar o desempenho e manter a segurança nas atividades relacionadas a operações IO (entradas e saídas) em aplicações .NET.
Em que situação o tema é útil: Sempre que for preciso editar, criar ou excluir algum arquivo hospedado no sistema
operacional, ou manter dados gravados temporariamente na memória do computador, obtendo o máximo
de performance no trabalho com dados de diversos formatos.
Primeiros passos com o namespace System.IO – Parte II: Neste artigo veremos as principais classes derivadas de Stream e que são usadas para manipulação de arquivos. Apresentaremos as classes File, Directory, StreamReader, StreamWriter e BufferedStream, explicando seus principais métodos e exemplificando o uso das mesmas.
Primeiros passos com o namespace System.IO - Parte 1
Conforme já comentamos no primeiro artigo, as tarefas de manipulação de arquivos são tarefas muito comuns no dia-a-dia do desenvolvedor, porém é fundamental o conhecimento dos recursos nativos do framework para tornar estas tarefas mais produtivas e seguras.
Neste artigo vamos estudar como uma aplicação pode utilizar o .NET framework para ler e escrever arquivos,
Para podermos realizar a manipulação de arquivos, criando, adicionando ou removendo conteúdo, ou até mesmo apenas lendo informações contidas nestes, precisamos primeiro entender como funciona o mecanismo de transferência de dados gravados para a aplicação que está solicitando os mesmos, e vice versa.
Para que esta transferência de dados seja possível o framework possui uma série de classes que derivam de uma classe base, chamada Stream. Um Stream pode ser classificado como o objeto que realiza a conexão entre a aplicação que está necessitando manipular os dados e a fonte onde estes dados estão armazenados, podendo ser o disco rígido, a memória, a internet, o próprio teclado etc. Streams não se limitam apenas a trabalhar com arquivos, mas também são aplicados nas transferências de dados como vídeos, imagens, voz e demais dados que necessitem de transmissão de dados. A principal função dos Streams é permitir a interação da aplicação com elementos externos, sejam eles quais forem.
Agora que conhecemos um pouco mais sobre o conceito de Stream, vamos conhecer quais as principais propriedades e métodos implementados pela classe abstrata Stream do .NET. Assim como as demais classes de manipulação I/O, a classe Stream também está localizada no namespace System.IO e possui as propriedades apresentadas na Tabela 1 e os métodos apresentados na Tabela 2 a seguir:
I/O: Esta sigla é muito utilizada na computação e significa Input/Output (Entrada/Saída). Refere-se à comunicação de entrada e saída de dados entre softwares ou hardwares. Operações de entrada e saída de dados armazenados em um disco rígido são consideradas uma operação de I/O, assim como operações de entrada e saída entre um computador e uma impressora, mouse, teclado, scanner etc.
Tabela 1. Propriedades da classe Stream
Propriedade | Descrição |
---|---|
CanRead | Esta propriedade determina quando o Stream suporta leitura de dados. |
CanSeek | Esta propriedade determina quando o Stream suporta seeking. Seeking é uma busca de uma posição no Stream. Através do Seek podemos posicionar o cursor de leitura ou gravação em um determinado local e ler ou gravar a partir deste local. |
CanTimeOut | Determina se o Stream possui um Timeout, ou seja, se a operação atual com o Stream pode expirar depois de determinado tempo. |
CanWrite | Determina se o Stream permite gravação de dados (escrita). |
Length | Esta propriedade retorna o tamanho do Stream, em bytes. |
Position | Retorna e permite informar qual a posição do cursor no Stream. Esta posição não pode ser maior que o tamanho retornado pela propriedade Length. |
ReadTimeout | Informação de qual é o tempo limite para operações de leitura do Stream. |
WriteTimeout | Informação de qual é o tempo limite para operações de gravação (escrita) do Stream. |
Tabela 2. Métodos da classe Stream
Método | Descrição |
---|---|
Close | Fecha o Stream e libera todos os recursos associados a ele. |
Flush | Limpa qualquer buffer existente para o Stream e força as alterações para que sejam gravadas na fonte de dados. |
Read | Este método executa uma leitura sequencial no Stream, conforme o número de bytes definido e a partir da posição atual do cursor no Stream, atualizando esta mesma posição após a leitura. |
ReadByte | Executa a leitura de apenas um byte no Stream, partindo da posição atual e atualizando esta posição após a leitura. É o mesmo que executar o método Read passando como parâmetros apenas um byte. |
Seek | Método que permite definir a posição do cursor no Stream sem a necessidade de se realizar a leitura até esta posição. |
SetLength | Define o tamanho do Stream. Caso o tamanho informado seja menor que o tamanho de dados contido no Stream este será truncado. Se for maior, apenas será expandido para o novo tamanho. |
Write | Método que permite a gravação de informação no Stream, informando o número de bytes desta informação e atualizando o mesmo para a nova posição após a gravação. |
WriteByte | Realiza o mesmo que no método Write, porém grava apenas um byte no Stream. |
Buffer: Termo utilizado para denominar uma região da memória do computador que está alocada para o armazenamento temporário de dados, sendo possível realizar leituras e gravações neste espaço.
A Figura 1 ilustra como os diferentes tipos de Streams, contidos no .net framework, se relacionam para fornecer uma estrutura organizada de leitura e gravação de dados em diversas fontes de dados e também em algumas classes de leitura (reader) e escrita (writer) que servem de apoio para o trabalho com Streams. Durante este artigo veremos os principais e mais utilizados Streams e suas classes de apoio.

Figura 1. Streams do .net framework e classes de apoio para leitura e escrita. (Fonte: http://www.cnblogs.com/erebus/articles/2176646.html)
Classes de Apoio para Streams
As classes de Streams podem ser utilizadas sozinhas ou em conjunto com classes de apoio, que são classes que nos fornecem serviços que facilitam a interação com os Streams.
Com a classe File podemos realizar uma série de operações com arquivos, como a leitura e escrita do conteúdo de um arquivo, a criação ou a abertura de um arquivo com permissões de somente leitura, a criação ou escrita de um arquivo com permissões de escrita, além de operações básicas com arquivos como a verificação se o arquivo pesquisado existe, exclusão de arquivos, dentre outras.
A classe File auxilia o trabalho com os Streams pelo fato de possuir alguns métodos específicos que retornam instâncias de classes do tipo Stream já abertas e prontas para a utilização. O objeto do tipo Stream mais básico retornado pela classe File é o objeto FileStream, que vamos estudar profundamente mais tarde, mas que tem como objetivo representar um arquivo no sistema de arquivos e nos possibilita interagir com o mesmo. Além deste objeto mais genérico, FileStream, a classe File também possui métodos que retornam Streams, mais específicos como o objeto StreamReader, que é um objeto que também representa um arquivo, porém com permissões de operações relacionadas somente à leitura dos dados deste arquivo, ou seja, somente será possível ler dados com este tipo de Stream.
Veremos a seguir as classes de apoio para Streams disponibilizadas pelo .net framework.
Classe File
Como comentamos anteriormente, a classe File possui uma série de propriedades e métodos que possibilitam o trabalho com Streams de uma forma mais simplificada. Para entender melhor como esta classe pode nos auxiliar, podemos verificar na Tabela 3 os seus principais métodos.
Tabela 3. Métodos da classe File.
Método | Descrição |
---|---|
AppendAllText | Adiciona um texto ao final do conteúdo de um arquivo existente, ou, no caso do arquivo não existir, cria o mesmo com o texto como conteúdo. |
AppentText | Abre um arquivo, ou cria um novo quando não existir, e retorna uma instância da classe StreamWriter a qual é preparada para a escrita de conteúdo no arquivo. |
Copy | Cria uma cópia do arquivo. |
Create | Cria um novo arquivo conforme definições do objeto e retorna uma instância de um FileStream. |
CreateText | Cria ou abre um arquivo e retorna a instância de um ... |