可以让多个进程从同一个文本文件中读取数据吗?

OK to have multiple processes reading from the same text file?

我继承了一组 .NET 项目的开发职责,其中包括 Windows 服务、ASP.NET 网站和通过任务管理器启动的标准可执行文件。

所有这些组件都连接到一个 MySQL 数据库。目前,加密的连接字符串位于单独的 app.config/web.config 文件中。我认为必须在多个地方更新连接字符串有点痛苦,所以我想到将连接字符串放在一个文本文件中,所有单独的组件都可以访问该文件。

在我全速前进之前,我想问一下我是否会引入一个错误,因为可能有多个进程试图同时访问这个文本文件。我写了一个读取文本文件的通用方法,我小心地确保文件以 "Read" 模式打开:

public string AESDecryptFromFile(string path, string password, string IV)
    {
        if (!File.Exists(path))
            throw new Exception("File not found: " + path);

        string cryptogram;
        using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            using (StreamReader sr = new StreamReader(fs))
            {
                cryptogram = sr.ReadToEnd().Trim(new char[] { '\r', '\n', ' ' });
            }
        }
        return AESDecrypt(cryptogram, password, IV);
    }

我没有任何理由相信如果我以这种方式实现进程会锁定文件,但我想我会问。

提前致谢!

除非您不更改文件,否则没关系。当您想在多个线程上写入或写入和读取时会出现问题,因为您不知道哪个线程将 write/read end/start 首先,因此您无法预测任何行为

我想您可能需要告诉您的 FileStream 构造函数您希望如何共享文件? "fileshare"

默认情况下,FileStream(string path, FileMode mode, FileAccess access) 构造函数也将获得以下配置:

  • 文件共享 = FileShare.Read
  • 缓冲区大小 = 4096
  • useAsync = false

因为您不希望进程锁定文件,所以这对您来说是完美的,因为您需要只读(参见 https://msdn.microsoft.com/en-us/library/system.io.fileshare(v=vs.110).aspx

然而,如果你想要明确,你可以使用以下构造函数:

FileStream s = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);