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]);
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:
Usar apenas File.Create
deixará 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 Dispose
diretamente:
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 Dispose
diretamente em vez de usar uma using
declaraçã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.Create
ea chamada para Dispose
. Se essa condição de corrida existir, suspeito que também existiria na using
versão, se o encadeamento fosse interrompido no final do File.Create
método, pouco antes do valor ser retornado ...
using (File.Create(filename)) ;
, mas eu amo a simplicidadeFile.Create(filename).Dispose();
File.Create(filename).Dispose();
vez de.
Close()
liberará os recursos também. Close()
apenas chama Dispose
- ver github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/...
using (new FileStream(filename, FileMode.CreateNew)) { }
File.WriteAllText("path", String.Empty);
ou
File.CreateText("path").Close();
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.
Encoding.UTF8
retorna 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.
WriteAllText
realmente 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[] { });
.
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"));
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.
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);
}
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);