2012-04-16 26 views
1

私は知っていますが、この質問は既に多くの場所で繰り返し尋ねられています。しかし、私はそれをgoogleにしようとしたが、このサイトを解決するためにチェックしたが、まだまだ短くなっている。私はまだすべての提案されたソリューションを使用した後でもこの問題に遭遇しています。ファイルが別のプロセスで使用されているためにファイルにアクセスできません

基本的に2つのプログラムがあります。各プログラムの機能は以下のようなものです。

  1. PROGRAMA - 機能:常時ソースファイル(TXT)
  2. ProgramB *にアップデート - 機能:常に先の場所にソースファイルをコピーします。

ProgramBを使用して、ctrl + c操作をシミュレートする必要があります。したがって、私はファイルを更新することでどこにアーカイブするかを検討しており、オペレータはそれをコピーすることもできます。

これまで私が試したことはこれです。以下は、機能をテストするサンプルプログラムです。

PROGRAMA

static void Main(string[] args) 
{ 
    // just prepare the data 
    List<string> tempList = new List<string>(); 
    for(int i = 0; i < 50000; i++) 
    { 
     tempList.Add(string.Format("xxx_{0}", i.ToString())); 
    } 

    try 
    { 
     // just to simulate constart update 
     for (int j = 0; j < 20000; j++) 
     { 
      using (FileStream file = new FileStream(tmpFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) 
      { 
       using (StreamWriter sw = new StreamWriter(file)) 
       { 
        foreach (string tmpName in tempList) 
        { 
         sw.WriteLine(tmpName); 
        } 
        sw.Close(); 
       } 
       file.Close(); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
     Console.ReadKey(); 
    } 
} 

ProgramB

static void Main(string[] args) 
{ 
    string source = @"C:\temp\test.txt"; 
    string dest = @"C:\temp\dest\test.txt"; 
    while (true) 
    { 
     try 
     { 
      File.Copy(source, dest, true); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
      Console.ReadKey(); 
     } 
    } 
} 
+0

ファイルが開かれているか、別のプログラムがそれを使用しているかどうかは分かりますか?あなたができることは、それが開かれているかどうかを確認するために追加することです – Zaki

+0

うーん。おそらく私はそうすることができます。または、FileStreamファイル=新しいFileStream(tmpFilePath、FileMode.OpenOrCreate、FileAccess.ReadWrite、FileShare.ReadWrite)でキャッチIO例外を実行しますか? – nonadoes

+0

はいそうでもあります – Zaki

答えて

2

代わりFile.Copyを使用しての、FileStreamを使用し、ビット自分自身をコピーしてみてください。上記のコードでは、File.Copyはファイルに設定されているアクセス許可を指定していないため、エラーが発生します。

+0

こんにちは、ありがとうございます。基本的にはProgramAは私がコードする必要がある私の側です。 ProgramBは、私はctrl + c操作を行っているシミュレータの並べ替えをしたいです。したがって、私はファイルを更新することができ、オペレータはそれをコピーすることができます。 – nonadoes

+0

ProgramBがあなたのコントロールからオペレータをシミュレートすることになっている場合、そのファイルにアクセスするにはProgramAループ/ブロックを持つ必要があります。 ProgramBが排他モードでファイルを開けないことを保証することはできません。 – GWLlosa

+0

あなたは正しいと思います。おそらく私の唯一の選択肢は、例外をキャッチするか、ファイルが使用中であることを確認して再試行することです。 – nonadoes

1

これがコメントする必要がありますが、それはあまりにも長いです。それはコーディングの答えよりもデザインの提案です。

私はこれらのプログラムの両方がタイマーであると仮定し、または予測可能性の欠如があることを意味しFileSystemWatcherにしています。プログラムAが呼び出されるとき、またはプログラムBが呼び出されるときに、読み取り/書き込み操作を実行するのに要する時間に関連して、あなたは保証することができません。言い換えれば

ファイルがあるため、設計におけるコントロールの固有の欠如のためにロックされるとき、あなたは予測することはできません。

それがすべてで可能なら、私は2つのプログラムを組み合わせると思います。本当に、あなたが望むのは、プログラムAの書き込みが終了するとすぐに、ファイルをコピーすることです(プログラムbの機能性)。プログラムAがファイルを書き込んだ後すぐにファイルをコピーするように、コードを書くことができない理由はありません。

予測可能性の欠如が問題の根本にある場合は、予測不可能性を取り除きます。

+0

お返事ありがとうございます。あなたは私がアーカイブしようとしているものの一種です。しかし、ProgramBは、私はCtrl + C操作を行っている演算子をシミュレートしたいです。 (あなたが疑っているように、オペレーターがいつCtrl + Cを押すのか分かりません)。ですから、プログラムAでアーカイブしようとすると、プログラムが同時に更新を続けることができます。オペレータはCtrl + C操作を実行できます。 – nonadoes

1

これらのプログラムが両方とも同じマシン上で実行されている場合は、書き込み先とファイルをコピーするときに、名前がMutexでロックされている可能性があります。

だから、プログラムAにあなたは

using (Mutex m = new Mutex(false,"MyMutex")) 
{ 
    m.WaitOne(); 
    // Your file writing code 
    m.ReleaseMutex(); 
} 

を追加し、ファイルのコピーコードの周りに同じことをするだろう。

+0

+1。これは私のファイル固有の答えよりもはるかに良い一般的なケースを解決します。 – GWLlosa

+0

こんにちは、あなたの提案に感謝します。素晴らしい提案です。しかし、ProgramBは、Ctrl + C操作を実行するようなシミュレーターのようなものです。だから、基本的に私はProgramAがファイルを更新し続け、同時にオペレータがそれをコピーできるようにしたい。 (ええと、私はこのサイトの投票システムにうんざりしていると思う) – nonadoes

関連する問題