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.

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:

Nota do DevMan

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.

Nota do DevMan

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.

Streams do .net framework e classes de apoio para leitura e escrita

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 ...
Quer ler esse conteúdo completo? Tenha acesso completo