Manipulação de Arquivos com StreamReader e StreamWriter
Dentre as várias classes com as quais podemos manipular arquivos, a StreamReader e StreamWriter são as mais comuns para fazer leitura e gravação, respectivamente. No exemplo a seguir, criei uma aplicação em WPF para ilustrar a utilização delas.
Nós vamos gravar um arquivo texto, oriundo de um StringBuilder, na pasta que o usuário preferir, utilizando para isto a classe FolderBrowserDialog nesta abordagem. Alternativamente, você pode instanciar um SaveFileDialog, que abre uma outra janela do Windows para salvar um arquivo num diretório.
Ao manipular arquivos, é recomendável escrever as instruções dentro de um bloco using, que se encarrega de dar dispose dos recursos utilizados em memória.
O construtor do StreamWriter precisa de um path válido. Então, após escolher a pasta, a variável directory será concatenada com o nome do arquivo.
Ex: C:\Users\Thiago\Desktop\Teste.txt
Obs.: O atributo append pode ser setado como true, caso queira sobrescrever um mesmo arquivo. Caso passe false ou nada, um novo arquivo será gerado.
private
void
btnGerarArquivo_Click(``object
sender, RoutedEventArgs e)
{
``string
text = GetText();
** **
``var
browserDialog = ``new
FolderBrowserDialog()
``{
``Description = ``"Por favor selecione uma pasta:"``,
``ShowNewFolderButton = ``true
``};
** **
``if
(browserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
``{
``string
directory = browserDialog.SelectedPath;
``string
fileName = ``"Teste.txt"``.Insert(0, ``"\\"``);
** **
``using
(``var
writer = ``new
StreamWriter(``string``.Concat(directory, fileName), ``true``))
``{
``writer.WriteLine(text);
** **
``System.Windows.MessageBox.Show(``"Arquivo criado com sucesso no diretório: "
+ directory);
``}
``}
}
Se não passar o nome do arquivo, só o diretório é lançada a UnauthorizedAccessException.
using`` ``(``var`` ``writer = ``new`` ``StreamWriter(``"C:\\Users\\Thiago\\Desktop"``, ``true``))
Se passar somente o nome do arquivo, ele o salva no mesmo diretório onde está salvo o seu projeto.
Ex: VS2013\Projects\Nome_Projeto\bin\Debug\Teste.txt
using`` ``(``var`` ``writer = ``new`` ``StreamWriter(``"Teste.txt"``, ``true``))
Agora, para a leitura, criamos um OpenFileDialog para o usuário escolher o arquivo a ser aberto e o texto será mostrado num TextBox na tela. O método ReadToEnd é responsável de ler todos os caracteres do começo ao fim do arquivo. Ainda, essa operação foi feita dentro de um bloco using:
private
void
btnLerArquivo_Click(``object
sender, RoutedEventArgs e)
{
``var
openFileDialog = ``new
OpenFileDialog();
** **
``if
(openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
``{
``using
(``var
reader = ``new
StreamReader(File.OpenRead(openFileDialog.FileName)))
``{
``txtBox1.Text = reader.ReadToEnd();
``}
``}
}
De fato, outras classes como Directory, Path e FileInfo são utilizadas exaustivamente para manipular informações de arquivos, diretórios e extensões. Há inúmeras maneiras possíveis de abordar esse cenário, inclusive.
Um abraço e até a próxima,
Thiago