可以让多个进程从同一个文本文件中读取数据吗?
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);
我继承了一组 .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);