Ir para o conteúdo

File e FileInfo

A classe File, no namespace system.IO, serve para ajudar à construção de objectos FileStream entre outras coisas. A classe FileInfo, também no namespace system.IO, serve para ajudar a criar e destruir ficheiros, entre outras coisas, como encapsular detalhes sobre ficheiros (tamanhos, atributos, timestamps, etc.).

StreamReader e StreamWriter

O StreamWriter deriva do TextWriter, de forma análoga o StreamReader deriva do TextReader, e definem métodos que permitem a escrita e a leitura de dados textuais para um dado stream.

Eis alguns métodos da classe TextWriter que nos interessam:

  • Close(): fecha o Writer e liberta os recursos associados (incluindo on handle para o ficheiro).
  • Write(): escreve a linha para a stream de texto, sem o new line no final da linha.
  • WriteLine(): escreve a linha para a stream de texto, com o new line no final da linha.
  • Flush(): limpa os buffers de escrita.

Eis alguns métodos da classe TextReader que nos interessam:

  • Read(): lê informação da stream de texto.
  • ReadLine(): lê uma linha de caracteres da stream e devolve a informação como uma string.
  • ReadToEnd(): lê todos os caracteres até ao final da stream e devolve essa infomação como uma única string.

Escrever Ficheiro

Neste exemplo, a classe WriteMyTextFile irá criar um ficheiro de nome pap.txt usando a classe FileInfo. Depois de criar o ficheiro, usando o método CreateText(), recebe-se um StreamWriter, que permite enviar strings para a stream, i.e. para o ficheiro de texto que temos actualmente aberto para escrita. Note-se que também é possível enviar dados numéricos através desta stream

using System;
using System.IO;

public class WriteTextfile
{
  public static void Main(string[] args)
     {
         FileInfo t = new FileInfo("pap.txt");
         StreamWriter Txt =t.CreateText();
         Txt.WriteLine("Visitem o cantinho do C# no fórum 
Portugal-a-Programar");
         Txt.WriteLine("https://www.portugal-a-programar.pt/");
         Txt.Write(Txt.NewLine);
         Txt.Close();
   }
}

Ler Ficheiro

Neste exemplo, a classe ReadMyTextFile irá abrir um ficheiro de nome pap.txt usando a classe FileInfo. Depois de abrir o ficheiro, usando o método OpenText(), recebe-se um StreamReader que permite receber strings da stream, i.e. ler os caracteres do ficheiro de texto que temos actualmente aberto para leitura.

using System;
using System.IO;

public class ReadMyTextFile 
{
   public static int Main(string[] args)
   {
      StreamReader re = File.OpenText("pap.txt");
      string input = null;
      while ((input = re.ReadLine()) != null)
      {
         Console.WriteLine(input);
      }
      re.Close();
      return 0;
   }
}

Ficheiros Binários

Escrever Ficheiro

Neste primeiro exemplo, a classe WriteBinaryFile irá criar um ficheiro de nome pap.data usando a classe File. Depois de criar o ficheiro, usando o método Create(), recebe-se um FileStream, o qual aplicado a um BinaryWriter, permite enviar qualquer tipo de dados e guardá-lo no ficheiro.

using System;
using System.IO;

public class WriteBinaryFile
{
  public static void Main(string[[]] args)
    {
      FileStream  fs = File.Create(Server.MapPath("pap.dat"));
      BinaryWriter bw = new BinaryWriter(fs); 

      int x = 10; 
      decimal d = 3.234M; 
      string str = "Visitem o cantinho do C# no Forum Portugal a Programar."; 

      bw.Write(x); 
      bw.Write(d); 
      bw.Write(str); 

      bw.Close(); 
      fs.Close();
   }
}

Ler Ficheiro

Neste exemplo, a classe ReadBinaryFile irá abrir um ficheiro de nome pap.data usando a classe File. Depois de abrir o ficheiro, usando o método OpenRead(), recebe-se um FileStream, o qual aplicado a um BinaryReader, permite recuperar qualquer tipo de dados.

using System;
using System.IO;

public class ReadBinaryFile 
{
   public static int Main(string[[]] args)
   {
      FileStream  fs = File.OpenRead(Server.MapPath("pap.data"));   
      BinaryReader br = new BinaryReader(fs); 

      Response.Write(br.ReadInt32()); 
      Response.Write(br.ReadDecimal()); 
      Response.Write(br.ReadString()); 

      br.Close(); 
      fs.Close();
  }
}

Copiar Ficheiro

Neste exemplo, a classe FileStream irá abrir o ficheiro calc.exe (atenção que a localização do ficheiro pode mudar de acordo com a instalação do Windows) e irá escrever uma cópia do ficheiro de nome calc_clone.exe em c:\. O acesso ao ficheiro, tanto para leitura como para escrita é efectuado através do FileStream, sendo um dos argumentos do construtor o modo de acesso ao ficheiro. Uma vez aberto o ficheiro, copia-se o conteúdo do mesmo para um array de bytes: o array de bytes MyData será tão grande quanto o tamanho da stream, que representa o ficheiro binário, e usando o método Read() atribui-se o conteúdo do ficheiro ao MyData. Após a leitura do ficheiro a stream é fechada e passa-se à escrita. Tendo em memória o conteúdo do ficheiro binário, basta escrevê-lo no disco: usando o BinaryWriter() ligado ao ficheiro que queremos escrever, basta usar o método Write() com o MyData como argumento.

using System;
using System.IO;

public class ReadBinaryFile 
{
   public static int Main(string[[]] args)
   {
    // Ler
    FileStream fsr = new FileStream(@"C:\\winnt\\system32\\calc.exe", FileMode.OpenOrCreate, FileAccess.Read);
    byte[[]] MyData= new byte[[fsr.Length]];
    fsr.Read(MyData, 0, System.Convert.ToInt32(fsr.Length));
    fsr.Close();

    // Escrever
    FileStream fsw = new FileStream(@"C:\\calc_clone.exe", FileMode.OpenOrCreate, FileAccess.Write);
    BinaryWriter bw = new BinaryWriter(fsw);
    bw.Write(MyData);
    bw.Close();
    fsw.Close();
  }
}