【问题标题】:C# how to lock a file from application start till application endC#如何从应用程序开始到应用程序结束锁定文件
【发布时间】:2018-04-07 21:30:01
【问题描述】:

我有一个包含两个表单的应用程序。

在第一种形式(MainMenu)中,我声明并初始化了一个 FileStream 来锁定一个特定的文件。在第二种形式(EdiMenu)中,我只是声明了另一个 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,它都会引发异常。

有人能指出正确的方向吗,如何从应用程序开始锁定文件到应用程序结束,以及如何在应用程序的任何地方使用锁定的文件,而不会出现文件被另一个进程锁定的异常?

【问题讨论】:

  • 有什么异常?
  • 它抛出了一个异常,该文件正在被另一个进程使用

标签: c# winforms filestream


【解决方案1】:

这是第一次工作:

XDocument xdoc = XDocument.Load(configurationFile);

第二次读取时抛出异常的原因是需要重置流位置。

在您的第二种形式中,在尝试再次加载流之前重置流位置:

configurationFile.Position = 0;               
XDocument xdoc2 = XDocument.Load(configurationFile);

【讨论】:

  • 如此简单,但它完全解决了我的问题,非常感谢:)
【解决方案2】:

您最好的选择是使用某种单例类实例来处理配置文件访问,例如

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多