3

CreateTextメソッドを使用して、「App1」に空のファイル(以下のように)を作成していました。次に、別のアプリケーションにそのファイルへの書き込みを試みましたが、ロックされていたため失敗しました。「App1」を閉じるまでロックが解除されませんでした

File.CreateText(path)

これを修正するには、次のようにします。

Dim sw As StreamWriter = File.CreateText(path)
sw.Close()

CreateTextだけを呼び出すとファイルがロックされるのはなぜですか?暗黙のストリームライターやファイルライター、または何かが作成されていますか?

tep

4

8 に答える 8

7

はい、そうです。 指定したファイルに対して開いてCreateText()いるオブジェクトを返します。StreamWriter

戻り値を無視するとStreamWriter、ファイルを保持したままになります。あなたは本当にそれをコードの2番目のブロックのように扱う必要があります。

于 2010-02-03T00:49:01.630 に答える
5

暗黙的なストリームライターやファイルライター、または何かが作成されていますか?

独自のコードで示されているように、StreamWriter が作成されます。そのため、戻り値を StreamWriter 型の変数に割り当てることができます。

これは、空のファイルを作成するために私が知っている最も簡単な方法です。

File.CreateText(path).Close()

編集

テスト済みで、動作することが確認されています。

于 2010-02-03T01:23:46.110 に答える
2

CreateText()はファイルを作成してから を返すStreamWriterので、必要に応じてファイルへの書き込みを続けることができます。

ファイルを閉じるには、ファイルを明示的に閉じる必要があります(例のように)。

于 2010-02-03T00:55:07.327 に答える
1

ストリームのない空のファイルが必要な場合は、これを試してください。

File.WriteAllBytes(path, new byte[0]);
于 2010-02-03T01:19:34.070 に答える
1

close が呼び出されたら、StreamWriter を using ブロックで囲み、範囲を限定する必要があります。これにより、dispose (クローズ) が呼び出され、参照としてのリンクが解除され、GC に「送信」されます。

Using sw As StreamWriter = File.CreateText(path)
    sw.Write("")
End Using
于 2010-02-03T01:24:35.400 に答える
1

File.CreateFile は StreamWriter を介して、最終的に FileStream コンストラクターを呼び出し、FileMode.Create、FileAccess.Write、および FileShare.Read を渡します。これは、ファイルを作成、アクセス、共有するためのごく普通の方法です。ファイルを作成したばかりなので、確かに書き込みアクセスが必要です。そして、あなたがファイルを書き込んでいる間に他のプロセスがファイルを読んでも大丈夫です。

あなたが求めていることは可能ですが、File.CreateFile() は使用できません。最初に FileStream (Create、Write、および FileShared.ReadWrite) を作成し、それを StreamWriter コンストラクターに渡す必要があります。これで、あなたと別のプロセスの両方がファイルを書き込むことができます。

これはややこしいことですが、あなたと他のプロセスが同時にファイルに書き込むとします。これは先着順で、ファイルにはプログラムの出力が含まれ、他のプロセスの出力とランダムに混合されます。それが起こった後、ファイルが読み取り可能になる可能性はほとんどありません。

これが起こらないように、意図的に自分でファイルに書き込まないようにするなどのことをしたいかもしれません。これは非常に珍しいことですが、機能させることができます。その場合、より大きな問題は、そのファイルが存在することを他のプロセスが検出することです。ファイルの作成を他のプロセスに任せれば、おそらくすべてうまくいくでしょう。

于 2010-02-03T01:28:13.550 に答える
0

はい、StreamWriterが作成されます。ドキュメントを参照してください。ファイルに書き込む最初のプログラムで作成することをお勧めします。

于 2010-02-03T00:48:36.990 に答える
0

最も簡単な解決策は、作成と終了を行うラッパー関数を作成することだと思います。

Module Tools
  Sub CreateTextNoLock(ByVal text as String)
    Dim sw = File.CreateText(text)
    sw.Close
  End Sub
End Module
于 2010-02-03T00:54:24.460 に答える