Quelle est la manière la plus simple / canonique de créer un fichier vide en C # / .NET?
Le moyen le plus simple que j'ai pu trouver jusqu'à présent est:
System.IO.File.WriteAllLines(filename, new string[0]);
Utiliser juste File.Create
laissera le fichier ouvert, ce qui n'est probablement pas ce que vous voulez.
Vous pouvez utiliser:
using (File.Create(filename)) ;
Cela semble un peu étrange, remarquez. Vous pouvez utiliser des accolades à la place:
using (File.Create(filename)) {}
Ou appelez simplement Dispose
directement:
File.Create(filename).Dispose();
Quoi qu'il en soit, si vous comptez l'utiliser à plusieurs endroits, vous devriez probablement envisager de l'envelopper dans une méthode d'aide, par exemple
public static void CreateEmptyFile(string filename)
{
File.Create(filename).Dispose();
}
Notez que l' appel Dispose
directement au lieu d'utiliser une using
déclaration ne fait pas vraiment beaucoup de différence ici autant que je peux dire - la seule façon qu'il pourrait faire une différence si le thread a été interrompu entre l'appel à File.Create
et l'appel à Dispose
. Si cette condition de concurrence existe, je soupçonne qu'elle existerait également dans la using
version, si le thread était abandonné à la toute fin de la File.Create
méthode, juste avant que la valeur ne soit renvoyée ...
using (File.Create(filename)) ;
, mais j'adore la simplicité deFile.Create(filename).Dispose();
File.Create(filename).Dispose();
au lieu de.Close()
libérera également les ressources.Close()
appelle justeDispose
- voir github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…using (new FileStream(filename, FileMode.CreateNew)) { }
ou
la source
File.WriteAllText(string, string)
utilise "l'encodage UTF-8 sans marque d'ordre d'octet (BOM)" . Si vous en voyez toujours un, ce serait un bogue dans WriteAllText ou dans sa documentation qui mérite d'être signalé.Encoding.UTF8
renvoie un encodeur qui génère la marque d'ordre d'octet (BOM). Vous pouvez utilisernew UTF8Encoding(false)
pour obtenir un encodeur UTF8 qui ne génère pas la nomenclature.WriteAllText
se comporte vraiment différemment dans la version précédente de .NET. Cependant, pour être plus sûr, ignorez simplement la partie encodage et utilisez à laFile.WriteAllBytes(path, new byte[] { });
place.Comme d'autres l'ont souligné, vous devez supprimer cet objet ou l'envelopper dans une instruction using vide.
la source
Pour éviter d'écraser accidentellement un fichier existant, utilisez:
... et gérer l'exception IOException qui se produira si le fichier existe déjà.
File.Create
, ce qui est suggéré dans d'autres réponses, écrasera le contenu du fichier s'il existe déjà. Dans des cas simples, vous pouvez atténuer ce problème en utilisantFile.Exists()
. Cependant, quelque chose de plus robuste est nécessaire dans les scénarios où plusieurs threads et / ou processus tentent de créer des fichiers dans le même dossier simultanément.la source
Vous pouvez chaîner des méthodes hors de l'objet retourné, de sorte que vous pouvez immédiatement fermer le fichier que vous venez d'ouvrir dans une seule instruction.
la source
Un cas d'utilisation assez courant pour créer un fichier vide est de déclencher quelque chose d'autre qui se passe dans un processus différent en l'absence de communication de processus plus sophistiquée. Dans ce cas, il peut être utile que la création de fichier soit atomique du point de vue du monde extérieur (en particulier si la chose déclenchée va supprimer le fichier pour «consommer» le déclencheur).
Il peut donc être utile de créer un nom indésirable (Guid.NewGuid.ToString ()) dans le même répertoire que le fichier que vous souhaitez créer, puis de faire un File.Move du nom temporaire au nom souhaité. Sinon, le code déclenché qui vérifie l'existence du fichier puis supprime le déclencheur peut se trouver dans des conditions de concurrence où le fichier est supprimé avant d'être complètement fermé.
Avoir le fichier temporaire dans le même répertoire (et le même système de fichiers) vous donne l'atomicité que vous voudrez peut-être. Cela donne quelque chose comme.
la source
Path.GetTempFileName () créera un fichier vide au nom unique et lui renverra le chemin.
Si vous souhaitez contrôler le chemin mais obtenir un nom de fichier aléatoire, vous pouvez utiliser GetRandomFileName pour simplement renvoyer une chaîne de nom de fichier et l'utiliser avec Create
Par exemple:
la source