1
resposta

Garantindo a existência do arquivo

Também é possível utilizar uma função inicializadora do arquivo, veja:

namespace ByteBank;

class Program
{
  private static readonly string caminhoArquivo = Path.Combine(Environment.CurrentDirectory, "contas.txt");
  static void CriaArquivoSeNaoExistir()
  {
    Console.WriteLine(caminhoArquivo);
    if (!File.Exists(caminhoArquivo))
    {
      FileStream fs = File.Create(caminhoArquivo);
      fs.Close();
      Console.WriteLine("Arquivo criado com sucesso!");
    }
    else
    {
      Console.WriteLine("Arquivo já existe!");
    }
  }
  static void Main(string[] args)
  {
    CriaArquivoSeNaoExistir();
    //outros códigos aqui
  }
}

Path.Combine e Environment.CurrentDirectory formam o caminho absoluto do arquivo no contexto atual de execução independente de qual seja e independete de Sistema Operacional que esteja executando. A partir daí, é só fazer uso do caminhoArquivo para referência-lo nas próximas instruções.

Um dos únicos erros que talvez possa ocorrer a partir disto, é erros relacionados a permissões do sistema de arquivos.

Ou também utilizar o OpenOrCreate, dessa forma nem se faz necessário o uso do método.

namespace ByteBank;
class Program
{
  private static readonly string caminhoArquivo = Path.Combine(Environment.CurrentDirectory, "contas.txt");

  static void Main(string[] args)
  {
    FileStream fileStream = new(caminhoArquivo, FileMode.OpenOrCreate);
    fileStream.Close();
  }
}

O local que vai ser gerado o arquivo baseado na linha private static readonly string caminhoArquivo = Path.Combine(Environment.CurrentDirectory, "contas.txt"); depende de como o programa é executado. Com o uso do dotnet run normalmente o arquivo será gerado na raiz do projeto mesmo, então:

  • No windows o caminho pode ser algo como:

    C:\Users\<usuario>\dev\ByteBank\contas.txt
    
  • No Linux pode ser:

    /home/<usuario>/dev/ByteBank/contas.txt
    

Já quando utilizados IDEs, algumas delas executam o .exe (no caso do windows) gerado dentro da pasta Debug ou em uma pasta publish. Ou executam o arquivo compilado ELF no caso de sistemas linux também nessas pastas. Arquivos ELF em sistemas linux são como arquivos .exe no windows, para verificar isso você pode entrar na pasta onde fica o arquivo compilado com cd bin/Debug/net7.0/ e então executar file -h ByteBank. O retorno deve ser algo como:

ByteBank: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=c450da59bb69afc9b56f0bc9f9440fe6346e7317, stripped

Os caminhos de caminhoArquivo, agora podem ser,

  • no windows, algo como:

    C:\Users\<usuario>\dev\ByteBank\bin\Debug\net7.0\contas.txt
    
  • no Linux:

    /home/<usuario>/dev/ByteBank/bin/Debug/net7.0/contas.txt
    
1 resposta

Olá Andrey,

O código que você postou é uma ótima forma de garantir a existência do arquivo antes de utilizá-lo. Além disso, é interessante utilizar o Path.Combine e Environment.CurrentDirectory para formar o caminho absoluto do arquivo no contexto atual de execução, independente de qual seja e independente de Sistema Operacional que esteja executando.

Outra forma de criar um arquivo se ele não existir é utilizando o método OpenOrCreate, dessa forma nem se faz necessário o uso do método File.Exists.

Lembre-se que o local que vai ser gerado o arquivo baseado na linha private static readonly string caminhoArquivo = Path.Combine(Environment.CurrentDirectory, "contas.txt"); depende de como o programa é executado. Com o uso do dotnet run normalmente o arquivo será gerado na raiz do projeto mesmo, mas quando utilizados IDEs, algumas delas executam o .exe gerado dentro da pasta Debug ou em uma pasta publish.

Espero ter ajudado e bons estudos!