E/S de arquivo e de fluxo

E/S (entrada/saída) de arquivos e fluxos refere-se à transferência de dados de ou para uma mídia de armazenamento. No .NET, os namespaces System.IO contêm tipos que permitem a leitura e a gravação, de maneira síncrona e assíncrona, em fluxos de dados e arquivos. Esses namespaces também contêm tipos que executam compactação e descompactação em arquivos e tipos que possibilitam a comunicação por meio de pipes e portas seriais.

Um arquivo é uma coleção ordenada e nomeada de bytes com armazenamento persistente. Ao trabalhar com arquivos, você trabalha com caminhos de diretórios, armazenamento em disco e nomes de arquivos e diretórios. Por outro lado, um fluxo é uma sequência de bytes que você pode usar para ler e gravar em um repositório, o qual pode ser uma entre vários tipos de mídia de armazenamento (por exemplo, discos ou memória). Assim como há vários repositórios diferentes de discos, há vários tipos diferentes de fluxos diferentes de fluxos de arquivos, como os fluxos de rede, memória e pipes.

Arquivos e diretórios

Você pode usar os tipos no namespace System.IO para interagir com arquivos e diretórios. Por exemplo, você pode obter e definir propriedades para arquivos e diretórios e recuperar coleções de arquivos e diretórios com base em critérios de pesquisa.

Para convenções de nomenclatura de caminhos e os modos de expressar um caminho de arquivo para sistemas Windows, incluindo a sintaxe de dispositivo DOS compatível com o .NET Core 1.1 e posterior e o .NET Framework 4.6.2 e posterior, confira Formatos de caminho de arquivo em sistemas Windows.

Aqui estão algumas classes de arquivos e diretórios comumente usadas:

  • File – Fornece métodos estáticos para criar, copiar, excluir, mover e abrir arquivos, além de ajudar na criação de um objeto FileStream.

  • FileInfo – Fornece métodos de instâncias para criar, copiar, excluir, mover e abrir arquivos, além de ajudar na criação de um objeto FileStream.

  • Directory – Fornece métodos estáticos para criar, mover e enumerar ao longo de diretórios e subdiretórios.

  • DirectoryInfo – Fornece métodos de instância para criar, mover e enumerar ao longo de diretórios e subdiretórios.

  • Path – Fornece métodos e propriedades para processar cadeias de caracteres de diretório de uma maneira compatível com várias plataformas.

Você sempre deve fornecer tratamento de exceção robusto ao chamar métodos de sistema de arquivos. Para obter mais informações, veja Tratamento de erros de E/S.

Além de usar essas classes, os usuários do Visual Basic podem usar os métodos e as propriedades fornecidas pela classe Microsoft.VisualBasic.FileIO.FileSystem para E/S de arquivo.

Confira Como copiar diretórios, Como criar uma listagem de diretórios e Como enumerar diretórios e arquivos.

Fluxos

A classe base abstrata Stream oferece suporte a leitura e gravação de bytes. Todas as classes que representam fluxos herdam da classe Stream. A classe Stream e suas classes derivadas fornecem uma visão comum de fontes e repositórios de dados, isolando o programador de detalhes específicos do sistema operacional e dispositivos subjacentes.

Fluxos envolvem estas três operações fundamentais:

  • Leitura – Transferência de dados de um fluxo para uma estrutura de dados, como uma matriz de bytes.

  • Gravação – Transferência de dados para um fluxo a partir de uma fonte de dados.

  • Busca – Consulta e modificação da posição atual em um fluxo.

Dependendo do repositório ou da fonte de dados subjacente, os fluxos podem oferecer suporte somente algumas dessas capacidades. Por exemplo, a classe PipeStream não oferece suporte à operação de busca. As propriedades CanRead, CanWrite e CanSeek de um fluxo especificam as operações às quais o fluxo oferece suporte.

Algumas classes de fluxo comumente usadas são:

  • FileStream – Para leitura e gravação em um arquivo.

  • IsolatedStorageFileStream – Para leitura e gravação em um arquivo no armazenamento isolado.

  • MemoryStream – Para leitura e gravação na memória como o repositório de backup.

  • BufferedStream – Para melhorar o desempenho das operações de leitura e gravação.

  • NetworkStream – Para leitura e gravação via soquetes de rede.

  • PipeStream – Para leitura e gravação sobre pipes anônimos e nomeados.

  • CryptoStream – Para vincular fluxos de dados a transformações criptográficas.

Para um exemplo de como trabalhar com fluxos de forma assíncrona, confira E/S de arquivo assíncrona.

Leitores e gravadores

O namespace System.IO também fornece tipos usados para ler caracteres codificados de fluxos e gravá-los em fluxos. Normalmente, os fluxos são criados para a entrada e a saída de bytes. Os tipos de leitor e de gravador tratam a conversão dos caracteres codificados de/para bytes para que o fluxo possa concluir a operação. Cada classe de leitor e gravador é associada a um fluxo, o qual pode ser recuperado pela propriedade BaseStream da classe.

Algumas classes de leitores e gravadores comumente usadas são:

  • BinaryReader e BinaryWriter – Para leitura e gravação de tipos de dados primitivos como valores binários.

  • StreamReader e StreamWriter – Para leitura e gravação de caracteres usando um valor de codificação para converter os caracteres para/de bytes.

  • StringReader e StringWriter – Para leitura e gravação de caracteres e cadeias de caracteres.

  • TextReader e TextWriter – Funcionam como as classes base abstratas para outros leitores e gravadores que leem e gravam caracteres e cadeias de caracteres, mas não dados binários.

Confira Como ler texto de um arquivo, Como gravar texto em um arquivo, Como ler caracteres em uma cadeia de caracteres e Como gravar caracteres em uma cadeia de caracteres.

Operações de E/S assíncronas

A leitura ou gravação de uma grande quantidade de dados pode consumir muitos recursos. Você deve executar essas tarefas de forma assíncrona se seu aplicativo precisar continuar respondendo ao usuário. Com as operações de E/S síncronas, o thread de interface do usuário é bloqueado até que a operação de uso intensivo seja concluída. Use operações de E/S assíncronas durante o desenvolvimento de aplicativos da Microsoft Store 8.x para evitar causar a impressão de que o aplicativo parou de funcionar.

Os membros assíncronas contêm Async em seus nomes, como os métodos CopyToAsync, FlushAsync, ReadAsync e WriteAsync. Você usa esses métodos com as palavras-chave async e await.

Para saber mais, confira E/S de arquivo assíncrona.

Compactação

A compactação refere-se ao processo de reduzir o tamanho de um arquivo para fins de armazenamento. A descompactação é o processo de extrair o conteúdo de um arquivo compactado para um formato utilizável. O namespace System.IO.Compression contém tipos para compactar e descompactar arquivos e fluxos.

As classes a seguir são frequentemente usadas para compactar e descompactar arquivos e fluxos:

  • ZipArchive – Para criar e recuperar entradas em arquivos ZIP.

  • ZipArchiveEntry – Para representar um arquivo compactado.

  • ZipFile – para criar, extrair e abrir um pacote compactado.

  • ZipFileExtensions – Para criar e extrair entradas em um pacote compactado.

  • DeflateStream – Para compactar e descompactar fluxos usando o algoritmo de Deflate.

  • GZipStream – Para compactar e descompactar fluxos no formato de dados GZIP.

Confira How to: Compress and Extract Files (Como compactar e extrair arquivos).

Armazenamento isolado

Um armazenamento isolado é um mecanismo de armazenamento de dados que fornece isolamento e segurança ao definir maneiras padronizadas de associar códigos a dados salvos. O armazenamento fornece um sistema de arquivos virtual que é isolado por usuário, assembly e (opcionalmente) domínio. O armazenamento isolado é particularmente útil quando o aplicativo não tem permissão para acessar arquivos de usuários. Você pode salvar configurações ou arquivos para seu aplicativo de modo que ele seja controlado pela política de segurança do computador.

O armazenamento isolado não está disponível para aplicativos da Microsoft Store 8.x. Em vez disso, use as classes de dados do aplicativo no namespace Windows.Storage. Para saber mais, veja Dados de aplicativo.

As classes a seguir são usadas com frequência na implementação do armazenamento isolado:

Confira Armazenamentos isolado.

Operações de E/S em aplicativos da Windows Store

O .NET para aplicativos da Microsoft Store 8.x contém muitos dos tipos para leitura e gravação em fluxos. No entanto, esse conjunto não inclui todos os tipos de E/S do .NET.

Algumas diferenças importantes que devem ser observadas ao usar operações de E/S em aplicativos da Microsoft Store 8.x:

É possível converter entre fluxos do .NET Framework e fluxos do Windows Runtime, se necessário. Para mais informações, confira Como converter entre fluxos do .NET Framework e fluxos do Windows Runtime ou WindowsRuntimeStreamExtensions.

Para saber mais sobre operações de E/S em um aplicativo da Microsoft Store 8.x, confira Guia de início rápido: leitura e gravação de arquivos.

E/S e segurança

Ao usar as classes no namespace System.IO, você deve atender aos requisitos de segurança do sistema operacional, como ACLs (listas de controle de acesso) para controlar o acesso a arquivos e diretórios. Esse é um requisito adicional aos requisitos de FileIOPermission. As ACLs podem ser gerenciadas por meio de programação. Para saber mais, confira Como adicionar ou remover entradas da lista de controle de acesso.

As políticas de segurança padrão impedem que aplicativos da Internet ou intranet acessem arquivos no computador do usuário. Consequentemente, não use classes de E/S que exijam um caminho para um arquivo físico ao escrever código que será baixado via Internet ou intranet. Em vez disso, use armazenamento isolado para aplicativos .NET.

Uma verificação de segurança é executada somente quando o fluxo é construído. Consequentemente, não abra um fluxo para depois passá-lo para código ou domínios de aplicativos menos confiáveis.

  • Tarefas comuns de E/S
    Fornece uma lista das tarefas de E/S associadas a arquivos, diretórios e fluxos, além de links para conteúdo e exemplos relevantes para cada tarefa.

  • E/S de arquivo assíncrona
    Descreve as vantagens de desempenho e a operação básica da E/S assíncrona.

  • Armazenamentos isolado
    Descreve um mecanismo de armazenamento isolado que fornece isolamento e segurança ao definir maneiras padronizadas de associar códigos aos dados salvos.

  • Pipes
    Descreve operações de pipes anônimos e nomeados no .NET.

  • Arquivos mapeados em memória
    Descreve arquivos mapeados na memória, os quais armazenam o conteúdo de arquivos do disco na memória virtual. Você pode usar arquivos mapeados na memória para editar arquivos muito grandes e para criar memória compartilhada para a comunicação entre processos.