1

私は知っています、この質問はすでに多くの場所で繰り返し尋ねられています. しかし、私はそれをグーグルで検索し、このサイトで解決策を確認しようとしましたが、まだ不足しています. 提案された解決策をすべて使用した後でも、まだこの問題が発生しています。

基本的に、私は2つの別々のプログラムを持っています。各プログラムの機能は以下のようなものです。

  1. ProgramA - 機能: ソースファイル(txt)に常に更新
  2. ProgramB * - 機能: ソース ファイルをコピー先の場所に常にコピーします。

ProgramB では、ctrl+c 操作をシミュレートしたいと思います。したがって、ファイルを更新してオペレーターがコピーできる場所をアーカイブしようとしています。

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

プログラムA

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();
    }
}

プログラムB

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();
        }
    }
}
4

3 に答える 3

2

File.Copyを使用する代わりに、 FileStreamを使用して自分でビットをコピーしてみてください。File.Copy は、ファイルに設定する FileShareパーミッションを指定していないため、上記のコードはエラーになります。

于 2012-04-16T15:45:00.880 に答える
1

これはコメントのはずですが、長すぎます。これは、コーディングの答えというよりも、設計の提案です。

これらのプログラムは両方ともタイマーまたは FileSystemWatcher 上にあると想定しています。つまり、予測可能性に欠けているということです。読み取り/書き込み操作の実行にかかる時間に関して、プログラム A がいつ呼び出されるか、またはプログラム B がいつ呼び出されるかを保証することはできません。

言い換えれば、ファイルがロックされるタイミングを予測することはできません。これは、設計上の制御が本質的に欠如しているためです。

可能であれば、2 つのプログラムを組み合わせたいと思います。本当に、あなたが望むのは、プログラム A が書き込みを完了するとすぐに、ファイルがコピーされることです (プログラム b の機能)。プログラムAがファイルへの書き込み後すぐにファイルをコピーするようにコーディングできない(明らかな)理由はありません。

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

于 2012-04-16T15:44:26.817 に答える
1

これらのプログラムが両方とも同じマシンで実行されている場合は、ファイルへの書き込みとコピーを行うときに名前付きミューテックスとロックを使用できます。

したがって、プログラム A では次のように追加します。

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

そして、ファイル コピー コードに対して同じことを行います。

于 2012-04-16T15:46:27.010 に答える