2017-10-26 6 views
0

私は2つのフォームを持つアプリケーションを持っています。C#アプリケーション開始からアプリケーション終了までファイルをロックする方法

最初のフォーム(MainMenu)では、特定のファイルをロックするためにFileStreamを宣言して初期化します。 2番目の形式(EdiMenu)では、私は別のFileStreamを宣言します。

ユーザーがボタンをクリックすると、FileStreamとファイルロックがフォーム2でFileStreamに与えられ、最初のフォームが閉じます。私は、文字列またはのFileStreamを渡すとXDocument、どんなにでファイルを読むためにwan't場合に、第2の形態において

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 
    } 
} 

は、それが例外をスローします。

誰かが正しい方向に私を指摘することができますか、アプリケーションの開始からアプリケーションの終了までファイルをロックする方法と、ファイルが別のプロセスによってロックされていることを除いて、アプリケーションのどこからでもロックされたファイルを使用する方法はありますか?

+0

何が例外ですか? –

+0

それは例外を投げた、そのファイルは別のプロセスによって使用されていた –

答えて

0

これが初めて動作します:あなたは、ストリームの位置をリセットする必要があるので、あなたがそれをもう一度読んしようとすると、それが例外をスロー

XDocument xdoc = XDocument.Load(configurationFile); 

理由があります。

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

だからシンプルだが、それは私の問題を完全に解決する、ありがとう:) –

0

あなたの最良の選択は

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); 
     } 
} 
のようなコンフィギュレーション・ファイルへのアクセスを処理するために、シングルトンクラスのインスタンスのいくつかの種類を使用することです:あなたの2番目の形式では

、再びストリームをロードしようとする前に、ストリームの位置をリセット

そして、あなたは

ConfigurationManager.Instance.Lock(applicationConfigurationFile); 

とアクセスをForm1

にファイルをロックすることができますそれはForm2で

XDocument xdoc = XDocument.Load(ConfigurationManager.Instance.Configuration); 
関連する問題