C# 如何从应用程序启动到应用程序结束锁定文件
C# how to lock a file from application start till application end
我的申请有两种形式。
在第一种形式 (MainMenu) 中,我声明并初始化一个 FileStream 以锁定特定文件。在第二种形式 (EdiMenu) 中,我只是声明了另一个 FileStream。
当用户点击一个按钮时,FileStream 和文件锁应该提供给第二个表单中的 FileStream,第一个表单将关闭。
public partial class MainMenu : Form
{
EdiMenu Edi_Menu; // Second form
private string applicationConfigurationFile = "configuration.xml";
private FileStream configurationFile;
private void mainMenu_Load(object sender, EventArgs e)
{
configurationFile = new FileStream(applicationConfigurationFile, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
configurationFile.Lock(1, configurationFile.Length);
}
private void LoadEdiForm_Click(object sender, EventArgs e)
{
XDocument xdoc = XDocument.Load(applicationConfigurationFile); // Throws an exception
XDocument xdoc = XDocument.Load(configurationFile); // Works
// Code to check the file content
Edi_Menu = new EdiMenu();
Edi_Menu.configurationFilePublic = configurationFile;
Edi_Menu.Show();
this.Close(); // First form terminates here and the second form remains
}
}
// Second Class/Form
public partial class EdiMenu : Form
{
private string applicationConfigurationFile = "configuration.xml";
private FileStream configurationFile;
public FileStream configurationFilePublic
{
get { return configurationFile; }
set { configurationFile = value; }
}
private void FillDatagrid()
{
XDocument xdoc = XDocument.Load(applicationConfigurationFile); // Throws an exception
XDocument xdoc = XDocument.Load(configurationFile); // Throws an exception
}
}
在第二种形式中,当我不想使用 XDocument 读取文件时,无论我传递的是字符串还是 FileStream,它都会抛出异常。
有人能给我指出正确的方向吗,如何从应用程序开始到应用程序结束锁定文件,以及如何在应用程序的任何地方使用锁定的文件,而不会出现文件被另一个进程锁定的异常情况?
这是第一次成功:
XDocument xdoc = XDocument.Load(configurationFile);
第二次读取时抛出异常是因为需要重新设置流位置
在您的第二种形式中,在尝试再次加载流之前重置流位置:
configurationFile.Position = 0;
XDocument xdoc2 = XDocument.Load(configurationFile);
您最好的选择是使用某种单例 class 实例来处理配置文件访问,例如
public sealed class ConfigurationManager {
private static readonly Lazy<ConfigurationManager> Lazy =
new Lazy<ConfigurationManager>(() => new ConfigurationManager());
private FileStream _configurationFile;
public static ConfigurationManager Instance => Lazy.Value;
private ConfigurationManager() {
}
public FileStream Configuration => _configurationFile;
public void Lock(string filepath) {
_configurationFile = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
_configurationFile.Lock(1, _configurationFile.Length);
}
}
然后就可以在Form1中锁定文件了
ConfigurationManager.Instance.Lock(applicationConfigurationFile);
并在 Form2 中访问它
XDocument xdoc = XDocument.Load(ConfigurationManager.Instance.Configuration);
我的申请有两种形式。
在第一种形式 (MainMenu) 中,我声明并初始化一个 FileStream 以锁定特定文件。在第二种形式 (EdiMenu) 中,我只是声明了另一个 FileStream。
当用户点击一个按钮时,FileStream 和文件锁应该提供给第二个表单中的 FileStream,第一个表单将关闭。
public partial class MainMenu : Form
{
EdiMenu Edi_Menu; // Second form
private string applicationConfigurationFile = "configuration.xml";
private FileStream configurationFile;
private void mainMenu_Load(object sender, EventArgs e)
{
configurationFile = new FileStream(applicationConfigurationFile, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
configurationFile.Lock(1, configurationFile.Length);
}
private void LoadEdiForm_Click(object sender, EventArgs e)
{
XDocument xdoc = XDocument.Load(applicationConfigurationFile); // Throws an exception
XDocument xdoc = XDocument.Load(configurationFile); // Works
// Code to check the file content
Edi_Menu = new EdiMenu();
Edi_Menu.configurationFilePublic = configurationFile;
Edi_Menu.Show();
this.Close(); // First form terminates here and the second form remains
}
}
// Second Class/Form
public partial class EdiMenu : Form
{
private string applicationConfigurationFile = "configuration.xml";
private FileStream configurationFile;
public FileStream configurationFilePublic
{
get { return configurationFile; }
set { configurationFile = value; }
}
private void FillDatagrid()
{
XDocument xdoc = XDocument.Load(applicationConfigurationFile); // Throws an exception
XDocument xdoc = XDocument.Load(configurationFile); // Throws an exception
}
}
在第二种形式中,当我不想使用 XDocument 读取文件时,无论我传递的是字符串还是 FileStream,它都会抛出异常。
有人能给我指出正确的方向吗,如何从应用程序开始到应用程序结束锁定文件,以及如何在应用程序的任何地方使用锁定的文件,而不会出现文件被另一个进程锁定的异常情况?
这是第一次成功:
XDocument xdoc = XDocument.Load(configurationFile);
第二次读取时抛出异常是因为需要重新设置流位置
在您的第二种形式中,在尝试再次加载流之前重置流位置:
configurationFile.Position = 0;
XDocument xdoc2 = XDocument.Load(configurationFile);
您最好的选择是使用某种单例 class 实例来处理配置文件访问,例如
public sealed class ConfigurationManager {
private static readonly Lazy<ConfigurationManager> Lazy =
new Lazy<ConfigurationManager>(() => new ConfigurationManager());
private FileStream _configurationFile;
public static ConfigurationManager Instance => Lazy.Value;
private ConfigurationManager() {
}
public FileStream Configuration => _configurationFile;
public void Lock(string filepath) {
_configurationFile = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
_configurationFile.Lock(1, _configurationFile.Length);
}
}
然后就可以在Form1中锁定文件了
ConfigurationManager.Instance.Lock(applicationConfigurationFile);
并在 Form2 中访问它
XDocument xdoc = XDocument.Load(ConfigurationManager.Instance.Configuration);