C#で空のファイルを作成する


186

C#/。NETで空のファイルを作成する最も簡単な/正規の方法は何ですか?

これまでに見つけた最も簡単な方法は次のとおりです。

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

回答:


384

just File.Createを使用するとファイルは開いたままになりますが、これはおそらく望んでいることではありません。

あなたは使うことができます:

using (File.Create(filename)) ;

それは少し奇妙に見えます、あなたに気をつけてください。代わりに中かっこを使用できます。

using (File.Create(filename)) {}

またはDispose直接呼び出すだけです:

File.Create(filename).Dispose();

どちらにしても、これを複数の場所で使用する場合は、ヘルパーメソッドでラップすることを検討する必要があります。たとえば、

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

呼び出すことを注意Dispose代わりに直接使用してusing、それが唯一の方法-声明は本当に私の知る限り、ここであまり違いはありませんでしたスレッドがへの呼び出しの間に中止された場合には差があることを確認File.Createしての呼び出しをDispose。その競合状態が存在する場合、その値が返される直前にメソッドの最後でスレッドが中止された場合、バージョンに存在すると考えられます...usingFile.Create


8
おかしい。同じコードを5分ほど前に書いたところです。File.Create(filename).Close();を実行しました 同じ
違い

2
私のコードはを使用していましたがusing (File.Create(filename)) ;File.Create(filename).Dispose();
Vadim

@BrianGenisio:約5分前にも同じコードを実行しただけです。私は他のプログラマーがどのようにそれをしたか見てググった。今ではFile.Create(filename).Dispose();代わりに使用しています。
ジャック

1
@ user3791372:Close()リソースも解放します。Close()呼び出すだけ-github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…をDispose参照
Jon Skeet

2
ファイルがすでに存在し、読み取り専用でない場合、ファイルの内容が上書きされることは明らかではありません。これを回避するには、次を使用しますusing (new FileStream(filename, FileMode.CreateNew)) { }
Phil Haselden 2016年

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

または

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

2
最初のものを使用すると、ファイルの長さは3バイト、つまりエンコードコードになります。2番目を使用すると、ファイルは0バイトになります(実際には空)。
2015年

1
@フィル:よろしいですか?ドキュメントにはバイト順マーク(BOM)なしの UTF-8エンコーディング」File.WriteAllText(string, string)使用している記載されています。それでも表示される場合は、WriteAllTextまたはそのドキュメントのバグであり、報告する価値があります。
ハインツィ

やってみた覚えがあります。多分それは以前の.Netバージョンの古いバグだったのでしょうか?UTF8エンコーディング(またはunicodeなど)を使用するように明示的に指定した場合、ファイルは空ではありません:<File.WriteAllText( "c:\ del.txt"、String.Empty、System.Text.Encoding.UTF8);>
フィル

1
@Fil、Encoding.UTF8バイトオーダーマーク(BOM)を出力するエンコーダーを返します。を使用new UTF8Encoding(false)して、BOMを出力しないUTF8エンコーダーを取得できます。
Daniel Crabtree

1
WriteAllText以前のバージョンの.NETで実際に動作が異なるかどうかはわかりません。ただし、念のため、エンコード部分をスキップしてFile.WriteAllBytes(path, new byte[] { });代わりに使用してください。
ユルゲン・Steinblock

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

他の人が指摘したように、このオブジェクトを破棄するか、空のusingステートメントでラップする必要があります。

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

4
オブジェクトを廃棄した方が良いでしょうか?例:(System.IO.File.Create(filepath)){}を使用
ケンタロミウラ2009

@ケンタロミウラ:私の考えは正確で、それゆえ私の答え:)
ジョン・スキート

5

既存のファイルを誤って上書きしないようにするには:

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

...ファイルがすでに存在する場合に発生するIOExceptionを処理します。

File.Create他の回答で提案されているは、ファイルが既に存在する場合、ファイルの内容を上書きします。単純なケースでは、を使用してこれを軽減できますFile.Exists()。ただし、複数のスレッドやプロセスが同じフォルダーに同時にファイルを作成しようとしているシナリオでは、より堅牢なものが必要です。


4

返されたオブジェクトからメソッドをチェーンすることができるため、1つのステートメントで開いたばかりのファイルをすぐに閉じることができます。

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

2

空のファイルを作成するためのやや一般的な使用例は、より高度なプロセス通信がない場合に別のプロセスで何かが発生することです。この場合、(特にトリガーされているものがファイルを削除してトリガーを「消費」する場合)、ファイルの作成を外界の視点からアトミックにするのに役立ちます。

そのため、作成するファイルと同じディレクトリにジャンク名(Guid.NewGuid.ToString())を作成し、一時的な名前から目的の名前にFile.Moveを実行すると役立ちます。そうしないと、ファイルの存在をチェックしてトリガーを削除するトリガーコードが、ファイルが完全にクローズされる前にファイルが削除されるという競合状態になる可能性があります。

一時ファイルを同じディレクトリ(およびファイルシステム)に置くと、必要なアトミック性が得られます。これは次のようなものです。

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()は、一意の名前が付けられた空のファイルを作成し、そのファイルへのパスを返します。

パスを制御したいがランダムなファイル名を取得したい場合は、GetRandomFileNameを使用してファイル名文字列を返し、Createで使用できます。

例えば:

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

IMHO GetTempFileName()の名前が完全に間違っています。
kay.herzam 2009

なぜこの答えが役に立たないのですか?
Crippledsmurf、

5
次の2つの理由から役に立たない:1.質問はランダムなファイル名の生成について何も尋ねないので、気が散る。2.ファイルは閉じられません。つまり、後で別のファイルライターを開こうとしたり、ファイルを移動しようとしたりすると、失敗します。
サティア川、2015

私はあなたのポイントをとりますが:1.すべてのファイルには名前が必要です。それは簡単でした。何かと衝突する可能性が低いものを取得するための便利な方法2.ファイルの作成について質問されました。問題のコードは、少なくとも、その後のファイルの管理は厳密には作成の一部ではないため、省略しました。簡潔にするために、質問に焦点を当てて回答を維持します
Crippledsmurf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.