0

ファイルを読み取り、リストに文字列の一部を追加してこのリストを返す関数があります。誰も何も変更したり、削除したり、現在読んでいるファイルが何であれ、それをロックしたかったので。すべてが大丈夫だった、私はどういうわけかこのようにそれをしました:

public static List<string> Read(string myfile)
{
  using (FileStream fs = File.Open(myfile, FileMode.Open, FileAccess.Read, FileShare.None))
  {
    //read lines, add string to a list
    //return list
  }
}

それはいいです。これで、別のクラスに別の関数があり、リストを処理したり、他の関数を呼び出したりします。今、時々私は私が読んでいたファイルを移動したいです。そして、ここに問題があります。Imは新しい関数にあり、関数Read(string myfile)はすでに処理されているため、ファイルにロックはありません。

//in another class
public static void DoStuff(/*somefile*/)
{
  List<string> = Read(/*somefile*/);
  //the file (somefile) is not more locked!
  //do stuff

  if (something)
    Move(/*somefile*/) //could get an error, file maybe not more there or changed...
}

したがって、別の関数/ユーザーがファイルを変更したり、名前を変更したり、削除したりする可能性があります=>このファイルを移動できません。または、変更したファイルを移動しますが、それはできません。スレッドを使用すると、同じ機能を持つ別のスレッドがファイルを再度ロックする可能性があり、ファイルを移動できませんでした。

そのため、どういうわけかこのファイルを長時間ロックする必要があります。簡単な方法はありますか?using (FileStream fs = File.Open(myfile, FileMode.Open, FileAccess.Read, FileShare.None)または、コードを置き換える必要がありますか?助言がありますか?ありがとうございました

4

4 に答える 4

0

ロックを維持できる唯一の方法は、コードで行ったように、排他的に開いたままにすることです。

たぶん、あなたは//do stuffあなたのusingステートメントの範囲内で、そして電話の直後にする必要がありますMove

于 2012-08-29T09:46:00.063 に答える
0

ファイルをより長くロックしたままにしたい場合は、Streamオブジェクトがより長く保持されるようにコードをリファクタリングする必要があります - 私はこのように aReadを受け入れるようにメソッドを変更しますFileStream

using (FileStream fs = File.Open(myfile, FileMode.Open, FileAccess., FileShare.None))
{
    List<string> = Read(fs);
    if (something)
    {
        File.Move(/* somefile */)
    }
}

あなたが抱えている問題はFile.Move、このファイルがすでにロックされているため、メソッドが失敗することです(あなたによって、しかしそれFile.Moveはわかりません)。

正確に何をしたいかによっては、ファイルを「移動」しながらファイルをロックしたままにする方法を考え出すことが可能かもしれません (たとえばsomething、事前に知っている場合は、ファイルを指定FileOptions.DeleteOnCloseして開き、新しいただし、これは実際にはファイルの移動と同じではないため、実際に何をしようとしているのかによって異なります。

一般に、そのようなことはほとんどの場合、価値があるよりも多くの問題を引き起こします。ファイルを移動する直前にファイルのロックを解除し、移動の結果としてスローされる例外をキャッチ/処理する方がよいでしょう。

于 2012-08-29T12:59:53.197 に答える
0

Read メソッドが呼び出されたときにのみ、ファイルをロックしています。

ロックしたままにして、決定したときにのみ解放したい場合は、メソッドを OpenFile(string filename) および CloseFile(string filename) にします。次に、Read メソッドから using ステートメントを削除します。

作業開始時に開きます(ロック)。必要なときに読んでください。移動する必要がある場合は、同じ名前で新しいファイルを作成し、コンテンツをコピーするだけです。元のファイルを閉じて (ロックを解除)、削除します。

于 2012-08-29T11:34:03.977 に答える
0

これはいくらロックしても防げません。ロックは、ファイル内のデータのみを保護します。ユーザー (またはその他のプログラム) は、引き続きファイルを移動または名前変更できます。名前、タイムスタンプ、ファイル属性などのファイルの属性は個別に保存され、自由に変更できます。

これは、どの Windows プログラムでも対処しなければならないことです。単純に例外をキャッチするだけで、ファイルに何かが起こったことを知らせることができることはほとんどありません。ユーザーが驚くことはめったにありません。前もって知る必要がある場合は、 FileSystemWatcherを使用して、発生時に通知を受け取ることができます。

于 2012-08-29T10:59:32.980 に答える