Criando um arquivo vazio em C #


186

Qual é a maneira mais simples / canônica de criar um arquivo vazio em C # / .NET?

A maneira mais simples de encontrar até agora é:

System.IO.File.WriteAllLines(filename, new string[0]);

Respostas:


384

Usar apenas File.Createdeixará o arquivo aberto, o que provavelmente não é o que você deseja.

Você poderia usar:

using (File.Create(filename)) ;

Parece um pouco estranho, veja bem. Você pode usar chaves em vez disso:

using (File.Create(filename)) {}

Ou apenas ligue Disposediretamente:

File.Create(filename).Dispose();

De qualquer forma, se você for usar isso em mais de um lugar, provavelmente considere envolvê-lo em um método auxiliar, por exemplo,

public static void CreateEmptyFile(string filename)
{
    File.Create(filename).Dispose();
}

Note-se que chamar Disposediretamente em vez de usar uma usingdeclaração realmente não faz muita diferença aqui tanto quanto eu posso dizer - a única maneira que poderia fazer a diferença é se o thread foram abortadas entre a chamada para File.Createea chamada para Dispose. Se essa condição de corrida existir, suspeito que também existiria na usingversão, se o encadeamento fosse interrompido no final do File.Createmétodo, pouco antes do valor ser retornado ...


8
Engraçado. Acabei de escrever o mesmo código há cerca de 5 minutos. Eu fiz File.Create (nome do arquivo) .Close (); Mesmo diff ...
Brian Genisio

2
Meu código estava usando using (File.Create(filename)) ;, mas eu amo a simplicidadeFile.Create(filename).Dispose();
Vadim

@BrianGenisio: Eu também fiz o mesmo código há cerca de 5 minutos! Eu apenas pesquisei no Google para ver como outros programadores fizeram isso. Agora estou usando em File.Create(filename).Dispose();vez de.
22415 Jack

1
@ user3791372: Close()liberará os recursos também. Close()apenas chama Dispose- ver github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/...
Jon Skeet

2
Pode não ser óbvio que, se o arquivo já existir e não for somente leitura, o conteúdo do arquivo será substituído. Para evitar isso, useusing (new FileStream(filename, FileMode.CreateNew)) { }
Phil Haselden 23/11

34
File.WriteAllText("path", String.Empty);

ou

File.CreateText("path").Close();

2
Usando o primeiro, o arquivo tem 3 bytes: o código de codificação. Usando o segundo, o arquivo tem 0 byte (realmente vazio).
Fil

1
@Fil: Você tem certeza? A documentação diz que File.WriteAllText(string, string)usa "UTF-8 codificação sem uma Byte-Order Mark (BOM)" . Se você ainda vir um, isso seria um bug no WriteAllText ou na documentação que vale a pena relatar.
Heinzi 7/03

Lembro que tentei. Talvez tenha sido um bug antigo da versão .Net anterior? O arquivo não estará vazio se eu especificar explicitamente o uso da codificação UTF8 (ou unicode ou outra coisa): <File.WriteAllText ("c: \ del.txt", String.Empty, System.Text.Encoding.UTF8);>
Fil

1
@Fil, Encoding.UTF8retorna um codificador que gera a BOM (Byte Order Mark). Você pode usar new UTF8Encoding(false)para obter um codificador UTF8 que não gera a BOM.
Daniel Crabtree

1
Não sei se WriteAllTextrealmente se comporta diferente na versão anterior do .NET. No entanto, para ter certeza, basta pular a parte de codificação e usar File.WriteAllBytes(path, new byte[] { });.
Jürgen Steinblock

20
System.IO.File.Create(@"C:\Temp.txt");

Como outros já apontaram, você deve descartar esse objeto ou envolvê-lo em uma declaração using vazia.

using (System.IO.File.Create(@"C:\Temp.txt"));

4
não será melhor descartar o objeto? por exemplo: using (System.IO.File.Create (filepath)) {}
kentaromiura:

@kentaromiura: Meus pensamentos exatamente, daí a minha resposta :)
Jon Skeet

5

Para evitar a substituição acidental de um arquivo existente, use:

using (new FileStream(filename, FileMode.CreateNew)) {}

... e lide com a IOException que ocorrerá se o arquivo já existir.

File.Create, sugerido em outras respostas, substituirá o conteúdo do arquivo, se ele já existir. Em casos simples, você pode atenuar isso usando File.Exists(). No entanto, algo mais robusto é necessário em cenários em que vários threads e / ou processos estão tentando criar arquivos na mesma pasta simultaneamente.


4

Você pode encadear métodos do objeto retornado, para poder fechar imediatamente o arquivo que você acabou de abrir em uma única instrução.

File.Open("filename", FileMode.Create).Close();

2

Um caso de uso um tanto comum para criar um arquivo vazio é acionar outra coisa acontecendo em um processo diferente na ausência de comunicação de processo mais sofisticada. Nesse caso, pode ajudar a criação atômica do arquivo do ponto de vista do mundo externo (principalmente se a coisa que está sendo acionada for excluir o arquivo para "consumir" o gatilho).

Portanto, pode ajudar a criar um nome indesejado (Guid.NewGuid.ToString ()) no mesmo diretório que o arquivo que você deseja criar e, em seguida, faça um File.Move do nome temporário para o nome desejado. Caso contrário, o código acionado que verifica a existência do arquivo e exclui o acionador pode executar em condições de corrida em que o arquivo é excluído antes de ser totalmente fechado.

Ter o arquivo temporário no mesmo diretório (e sistema de arquivos) fornece a atomicidade desejada. Isso dá algo como.

public void CreateEmptyFile(string path)
{
    string tempFilePath = Path.Combine(Path.GetDirectoryName(path),
        Guid.NewGuid.ToString());
    using (File.Create(tempFilePath)) {}
    File.Move(tempFilePath, path);
}

0

Path.GetTempFileName () criará um arquivo vazio nomeado exclusivamente e retornará o caminho para ele.

Se você deseja controlar o caminho, mas obter um nome de arquivo aleatório, você pode usar GetRandomFileName para retornar apenas uma string de nome de arquivo e usá-la com Create

Por exemplo:

string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);

IMHO GetTempFileName () está completamente errado.
Kay.herzam 29/04/09

Por que exatamente essa resposta não é útil?
Crippledsmurf

5
É inútil por dois motivos: 1. A pergunta não pergunta nada sobre como gerar um nome de arquivo aleatório, portanto é uma distração. 2. O arquivo não é fechado, o que significa que, se você tentar abrir outro gravador de arquivos posteriormente ou mover o arquivo, ele falhará.
River Satya

Aceito seus pontos, mas: 1. Todos os arquivos precisam de um nome. Isso foi simples. maneira conveniente de obter um que provavelmente não colidiria com nada 2. A pergunta feita sobre a criação de arquivos, cujo código em questão, no mínimo, o gerenciamento do arquivo a seguir não faz parte estritamente da criação, por isso o omiti pelo simplificar e mantendo a resposta centrou-se na questão
Crippledsmurf
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.