0

我的项目:我正在为机器视觉系统创建一个夜间测试系统。我希望能够看到实时结果,而不是等待所有测试完成。我们的旧系统是用 C++ 编写的,可以使用记事本或任何文本编辑器访问日志文件,以便在写入日志文件时查看 (.txt)。

我是怎么做到的:几年前,一位同事制作了一个日志文件写入类,我们的大量应用程序都在使用它。我尝试使用此类中的 dll,一切正常。但是,如果我在应用程序使用它时尝试打开其中一个日志文件,我会收到访问冲突错误:文件正在被另一个进程使用。

我是如何使它工作的:我只是从另一个项目中复制了该类并将其粘贴到我的项目的命名空间中。这解决了问题。

我的问题:为什么这行得通,但当我使用对 dll 的引用时却不行?我想“修复”或“更新”我部门中每个人都使用的 Logging 类,这样我的同事也可以在我们的 C# 应用程序中享受这个附加功能。

操作系统: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 回答