Trabalhando com Arquivos em C# – Parte 2

Olá pessoal, na 2ª parte de nossa série de artigos sobre manipulação de arquivos em C# iremos dar continuidade ao nosso Form criando os métodos dos dois botões restantes, o Alterar e o Excluir.

Faço este artigo com base nas videoaulas de Bruno Belizário, do Portal Linha de Código, mediante autorização do mesmo. Acompanhem o passo-a-passo:

Lembrando que para estes artigos estamos usando as classes FileStream, StreamReader e StreamWriter, todas contidas no namespace System.IO, que é específico para manipular arquivos.

Como dito anteriormente, vamos criar o método do botão Alterar Arquivo. Vá à página de códigos e faça o método a seguir, (o mais trabalhoso dos cinco, já que o objetivo aqui é alterar o arquivo sem perder as informações como data de criação):



private void Alterar()

{

try

{

//Verifico se o arquivo que desejo abrir existe e passo como parâmetro a variável respectiva

if (File.Exists(strPathFile))

{

//Instancio o FileStream passando como parâmetro a variável padrão, o FileMode que será

//o modo Open e o FileAccess, que será Read(somente leitura). Este método é diferente dos

//demais: primeiro irei abrir o arquivo, depois criar um FileStream temporário que irá

//armazenar os novos dados e depois criarei outro FileStream para fazer a junção dos dois

using (FileStream fs = new FileStream(strPathFile, FileMode.Open, FileAccess.Read))

{

//Aqui instancio o StreamReader passando como parâmetro o FileStream criado acima.

//Uso o StreamReader já que faço 1º a leitura do arquivo. Irei percorrer o arquivo e

//quando encontrar uma string qualquer farei a alteração por outra string qualquer

using (StreamReader sr = new StreamReader(fs))

{

//Crio o FileStream temporário onde irei gravar as informações

using (FileStream fsTmp = new FileStream(strPathFile + ".tmp",

FileMode.Create, FileAccess.Write))

{

//Instancio o StreamWriter para escrever os dados no arquivo temporário,

//passando como parâmetro a variável fsTmp, referente ao FileStream criado

using (StreamWriter sw = new StreamWriter(fsTmp))

{

//Crio uma variável e a atribuo como nula. Faço um while que percorrerá

//meu arquivo original e enquanto ele estiver diferente de nulo...

string strLinha = null;

while ((strLinha = sr.ReadLine()) != null)

{

//faço um indexof para verificar se existe a palavra adicionado,

//se ela existir, a substituo pela palavra alterado

if (strLinha.IndexOf("adicionado") > -1)

{

//uso o método Replace que espera o valor antigo e valor novo

strLinha = strLinha.Replace("adicionado", "alterado");

}

//Chamo o método Write do StreamWriter passando o strLinha como parâmetro

sw.Write(strLinha);

}

}

}

}

}

//Ao final excluo o arquivo anterior e movo o temporário no lugar do original

//Dessa forma não perco os dados de modificação de meu arquivo

File.Delete(strPathFile);

//No método Move passo o arquivo de origem, o temporário, e o de destino, o original

File.Move(strPathFile + ".tmp", strPathFile);

//Exibo a mensagem ao usuário

MessageBox.Show("Arquivo alterado com sucesso!");

}

else

{

//Se não existir exibo a mensagem

MessageBox.Show("Arquivo não encontrado!");

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}


Agora dê dois cliques no botão Alterar Arquivo e chame o método acima no evento do botão:



private void btnAlterar_Click(object sender, EventArgs e)

{

Alterar();

}


Salve, compile e clique no botão. Irá aparecer a seguinte mensagem, como mostra a Figura 01:

Figura 01 – Mensagem informando que o arquivo foi alterado

Agora clique no botão Abrir Arquivo e veja a alteração das palavras adicionado por alterado, como vemos abaixo na Figura 02:

Figura 02 – Substituição das palavras adicionado por alterado

Finalizando os métodos dos botões, vamos criar agora o método Excluir Arquivo (o mais simples dos cinco):



private void Excluir()

{

try

{

//Verifico se o arquivo que desejo abrir existe e passo como parâmetro a variável respectiva

if (File.Exists(strPathFile))

{

//Se existir chamo o método Delete da classe File para apagá-lo e exibo uma msg ao usuário

File.Delete(strPathFile);

MessageBox.Show("Arquivo excluído com sucesso!");

}

else

{

//Se não existir exibo a mensagem

MessageBox.Show("Arquivo não encontrado!");

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}


Faça o mesmo que antes, dê dois cliques no botão Excluir Arquivo e chame o método recém-criado:



private void btnExcluir_Click(object sender, EventArgs e)

{

Excluir();

}


Salve, compile e clique no botão Excluir Arquivo. O arquivo será excluído e aparecerá uma mensagem para você, como podemos ver na Figura 03:

Figura 03 – Mensagem informando que o arquivo foi excluído

Teste se o mesmo foi realmente excluído clicando no botão Abrir Arquivo e/ou indo na pasta C:\temp. Veja a mensagem de retorno nas Figuras 04 e 05:

Figuras 04 e 05 – Constatação de que o arquivo foi excluído

Uma boa dica é pra evitar a repetição de código, como feito em nossos if/else em que verificamos por diversas vezes se o arquivo existe, senão exibe uma mensagem, o certo seria se criássemos um método que fizesse essa validação, já que desta forma estaríamos diminuindo o tempo de codificação (mesmo que apenas deixássemos de usar o CTRL + C, CTRL + V!). Fica a dica!

Assim finalizo a 2ª parte de nosso artigo. Na próxima e última parte criaremos caixas de diálogo em nossa aplicação. Aguardem!

Créditos à Bruno Belizário, que fez as videoaulas e ao Portal Linha de Código, por onde pude baixá-las (mediante assinatura), estudá-las e posteriormente fazer este artigo.

Quaisquer dúvidas mandem emails para wellingtonbalbo@gmail.com ou deixem nos comentários deste artigo que responderei o mais rápido possível.

Até o próximo artigo!