2017-10-26 2 views
0

두 가지 형식의 응용 프로그램이 있습니다.C# 응용 프로그램 끝에서 응용 프로그램 끝까지 파일 잠그는 방법

첫 번째 양식 (MainMenu)에서 특정 파일을 잠그기 위해 FileStream을 선언하고 초기화합니다. 두 번째 형식 (EdiMenu)에서는 다른 FileStream을 선언합니다.

사용자가 버튼을 클릭하면 FileStream 및 파일 잠금이 형식 2의 FileStream에 주어져야하며 첫 번째 양식이 닫힙니다. I는 I 문자열 또는 FileStream을 통과하여 XDocument 경우 아무리으로 파일을 읽을 때, 상기 제 wan't 형태에서

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

당신이 그것을 두 번째 시간을 읽으려고 할 때 예외를 throw하는 이유입니다.

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); 
     } 
} 
같은 구성 파일 액세스를 처리하기 위해 싱글 톤 클래스 인스턴스의 어떤 종류를 사용하는 것입니다 : 두 번째 형태에서

다시 스트림을로드하기 전에 스트림 위치를 재설정

그리고 당신은

ConfigurationManager.Instance.Lock(applicationConfigurationFile); 

그리고 액세스를 Form1

에서 파일을 잠글 수 있습니다 그것 Form2에

XDocument xdoc = XDocument.Load(ConfigurationManager.Instance.Configuration);