Creazione di un file vuoto in C #


186

Qual è il modo più semplice / canonico per creare un file vuoto in C # /. NET?

Il modo più semplice che ho trovato finora è:

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

Risposte:


384

L'uso di just File.Createlascerà il file aperto, che probabilmente non è quello che vuoi.

Puoi usare:

using (File.Create(filename)) ;

Sembra un po 'strano, intendiamoci. È possibile utilizzare invece le parentesi graffe:

using (File.Create(filename)) {}

Oppure chiama Disposedirettamente:

File.Create(filename).Dispose();

Ad ogni modo, se hai intenzione di usarlo in più di un posto dovresti probabilmente considerare di avvolgerlo in un metodo di supporto, ad es.

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

Nota che chiamare Disposedirettamente invece di usare usingun'istruzione non fa davvero molta differenza qui per quanto posso dire - l'unico modo in cui potrebbe fare la differenza è se il thread fosse interrotto tra la chiamata a File.Createe la chiamata a Dispose. Se esiste quella condizione di gara, sospetto che esisterebbe anche nella usingversione, se il thread fosse interrotto alla fine del File.Createmetodo, appena prima che il valore fosse restituito ...


8
Divertente. Ho appena scritto lo stesso codice circa 5 minuti fa. Ho fatto File.Create (nome file) .Close (); Stessa diff ...
Brian Genisio,

2
Il mio codice stava usando using (File.Create(filename)) ;, ma adoro la semplicità diFile.Create(filename).Dispose();
Vadim

@BrianGenisio: ho fatto lo stesso codice anche circa 5 minuti fa! Ho appena cercato su Google come hanno fatto gli altri programmatori. Adesso sto usando File.Create(filename).Dispose();invece di.
Jack

1
@ user3791372: Close()rilascerà anche le risorse. Close()chiama solo Dispose- vedi github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
Jon Skeet

2
Potrebbe non essere ovvio che se il file esiste già e non è di sola lettura, il contenuto del file viene sovrascritto. Per evitare ciò, usausing (new FileStream(filename, FileMode.CreateNew)) { }
Phil Haselden il

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

o

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

2
Utilizzando il primo, il file è lungo 3 byte: il codice di codifica. Usando il secondo il file è di 0 byte (veramente vuoto).
Fil

1
@Fil: Ne sei sicuro? La documentazione afferma che File.WriteAllText(string, string)utilizza "codifica UTF-8 senza un Byte-Order Mark (BOM)" . Se ne vedi ancora uno, sarebbe un bug in WriteAllText o nella sua documentazione che vale la pena segnalare.
Heinzi,

Ricordo di aver provato. Forse era un vecchio bug della precedente versione .Net? Il file non è vuoto se si specifica esplicitamente di utilizzare la codifica UTF8 (o unicode o qualcos'altro): <File.WriteAllText ("c: \ del.txt", String.Empty, System.Text.Encoding.UTF8);>
Fil

1
@Fil, Encoding.UTF8restituisce un codificatore che emette il Byte Order Mark (BOM). È possibile utilizzare new UTF8Encoding(false)per ottenere un codificatore UTF8 che non genera la DBA.
Daniel Crabtree,

1
Non so se WriteAllTextsi comporta davvero diversamente nella versione precedente di .NET. Tuttavia, per essere più sicuro, basta saltare la parte di codifica e utilizzare File.WriteAllBytes(path, new byte[] { });invece.
Jürgen Steinblock,

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

Come altri hanno sottolineato, è necessario disporre di questo oggetto o avvolgerlo in un'istruzione using vuota.

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

4
non sarà meglio disporre l'oggetto? ad esempio: using (System.IO.File.Create (filepath)) {}
kentaromiura

@kentaromiura: I miei pensieri esattamente, quindi la mia risposta :)
Jon Skeet,

5

Per evitare la sovrascrittura accidentale di un file esistente utilizzare:

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

... e gestire IOException che si verificherà se il file esiste già.

File.Create, suggerito in altre risposte, sovrascriverà il contenuto del file se esiste già. In casi semplici puoi mitigarlo usando File.Exists(). Tuttavia, è necessario qualcosa di più robusto negli scenari in cui più thread e / o processi stanno tentando di creare file nella stessa cartella contemporaneamente.


4

È possibile concatenare i metodi sull'oggetto restituito, in modo da poter chiudere immediatamente il file appena aperto in una singola istruzione.

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

2

Un caso d'uso piuttosto comune per la creazione di un file vuoto è innescare qualcos'altro che accade in un processo diverso in assenza di una comunicazione di processo più sofisticata. In questo caso, può essere utile che la creazione del file sia atomica dal punto di vista del mondo esterno (in particolare se la cosa che viene attivata eliminerà il file per "consumare" il trigger).

Quindi può aiutare a creare un nome indesiderato (Guid.NewGuid.ToString ()) nella stessa directory del file che si desidera creare, quindi fare un File. Passare dal nome temporaneo al nome desiderato. In caso contrario, il codice attivato che verifica l'esistenza del file e quindi elimina il trigger potrebbe incorrere in condizioni di competizione in cui il file viene eliminato prima che sia completamente chiuso.

Avere il file temporaneo nella stessa directory (e file system) ti dà l'atomicità che potresti desiderare. Questo dà qualcosa di simile.

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 () creerà un file vuoto con nome univoco e vi restituirà il percorso.

Se si desidera controllare il percorso ma ottenere un nome file casuale, è possibile utilizzare GetRandomFileName per restituire una stringa di nome file e utilizzarla con Crea

Per esempio:

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

IMHO GetTempFileName () è completamente errato.
kay.herzam,

Perché esattamente questa risposta non è utile?
Crippledsmurf,

5
È inutile per due motivi: 1. La domanda non pone nulla sulla generazione di un nome di file casuale, quindi questa è una distrazione. 2. Il file non viene chiuso, il che significa che se in seguito si tenta di aprire un altro writer di file o di spostare il file, fallirà.
Fiume Satya,

Prendo i tuoi punti ma: 1. Tutti i file hanno bisogno di un nome. È stato semplice. modo conveniente per ottenerne uno che probabilmente non si scontrerebbe con nulla 2. La domanda posta sulla creazione di file, che il codice in questione svolge, in minima parte, la gestione del file da allora in poi non è strettamente parte della creazione, quindi l'ho omesso per il per semplicità e mantenendo la risposta focalizzata sulla domanda
Crippledsmurf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.