0

私のプロジェクト: マシン ビジョン システムの夜間テスト システムを作成しています。すべてのテストが完了するのを待つのではなく、リアルタイムで結果を確認できるようにしたいと考えています。私たちの古いシステムは C++ で書かれており、書き込み中にメモ帳や表示用のテキスト エディター (.txt) を使用してログ ファイルにアクセスできます。

これを行う方法: 同僚が何年も前に、大量のアプリケーションが使用するログ ファイル書き込みクラスを作成しました。このクラスの dll を使用しようとしましたが、すべてうまくいきました。しかし、アプリケーションがログ ファイルを使用しているときにログ ファイルの 1 つを開こうとすると、アクセス違反エラーが発生します。ファイルは別のプロセスによって使用されています。

どのように機能させましたか: クラスを他のプロジェクトからコピーして、自分のプロジェクトの名前空間に貼り付けただけです。これで問題は解決します。

私の質問: dll への参照を使用すると、なぜこれが機能するのですか? 私の部署の全員が使用する Logging クラスを「修正」または「更新」して、同僚が C# アプリケーションでもこの追加機能を利用できるようにしたいと考えています。

OS: Win 7 32 ビット/Win XP/Visual Studio 2005 および Visual Studio 2010。

ファイルを作成する方法のコードを以下に示します。ストリームライターを使用してファイルに書き込みます。

どんな助けでも大歓迎です。

よろしくお願いします、B

    /// <summary>
    /// Creates a file with the given file name or else uses the defualt.
    /// </summary>
    /// <param name="fileName">Name of file to create, if null use default.</param>
    /// <param name="append">Whether to append to file if it already exists</param>
    /// <returns>StreamWriter to the created file.</returns>
    private StreamWriter CreateFile(string fileName, bool append)
    {
        FileStream fsOut;
        StreamWriter sw;
        if (append)
        {
            //sw = File.AppendText(fileName);
            //just a note I tried many different modifiers of the FileAccess property and nothing seemed to work.
            fsOut = File.Open(fileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
        }
        else
        {
            //sw = new StreamWriter(fileName);
            fsOut = File.Create(fileName);
        }

        sw = new StreamWriter(fsOut);
        sw.AutoFlush = true;
        return sw;
    }
4

1 に答える 1

2

fsOut = File.Create(fileName);非共有モードでファイルを開きます。したがって、あなたの「解決策」はコードのコピーとはあまり関係がないと思われますが、新しいコードパスではなく「追加」コードパスにたまたまヒットしたことと関係があると思います。

どちらのプロセスも、互換性のある FileShare フラグを使用してファイルを開く必要があるため、デフォルトの「share-none」フラグを使用してログ ファイルを開かないようにしてください。

于 2012-06-26T23:48:20.180 に答える