3

だからここに私のコードがあります

if (!File.Exists(pathName))
{
    File.Create(pathName);
}
StreamWriter outputFile = new StreamWriter(pathName,true);

しかし、最初にプログラムを実行するたびに、ファイルを含むパスが作成されます。ただし、StreamWriter 行に到達すると、ファイルが別のプロセスで使用されていると表示されるため、プログラムがクラッシュします。File.Create ステートメントと StreamWriter ステートメントの間に欠けているものはありますか?

4

4 に答える 4

6

File.Createは、ファイルを作成するだけでなく、読み取りと書き込みのためにファイルを開きます。したがって、StreamWriterを独自のプロセスで作成しようとすると、ファイルは実際にすでに使用されています。

StreamWriterpathNameは、ファイルが存在しない場合に指定されたファイルを作成するため、File.Existsチェックを削除してコードを簡略化できます。

using (var writer = new StreamWriter(pathName, true))
{
   // ...
}

MSDNから:

StreamWriterコンストラクター(ストリーム)

指定されたファイル[...]のStreamWriterクラスの新しいインスタンスを初期化します。ファイルが存在する場合は、上書きまたは追加できます。ファイルが存在しない場合、このコンストラクターは新しいファイルを作成します。

于 2010-05-26T15:08:19.957 に答える
2

他の人が述べたように、ファイルを開いたままにしている をFile.Create作成しています。FileWriterしかし、それを除けば、ファイルを開こうとする前にファイルの存在を確認する理由はありません。File.Open既存のファイルが存在する場合は、そのファイルを開くように指示するだけです。

var outputFile = new StreamWriter(File.Open(pathName, FileMode.OpenOrCreate));
于 2010-05-26T15:12:05.000 に答える
1

File.Create の後、ストリームはまだ開いています。

あなたが使用することができます:

File.Create(pathName).Close();

これにより、ファイルが作成され、直接閉じられます。

より受け入れられるのは次のとおりです。

using (var file = File.Create(pathName)) {
   // use the file here
   // it will be closed when leaving the using block
}

また、コードでさらに2行作成するファイルを作成するのはなぜですか? StreamWriter コンストラクター( append=true を指定) は、ファイルが存在しない場合にファイルを作成または追加します。

于 2010-05-26T15:07:09.503 に答える
0

File.CreateはFileStreamを返します。パス名を渡す代わりに、それを保存してStreamWriterコンストラクターに渡してみませんか?

于 2010-05-26T15:09:52.007 に答える