2012-01-07 2 views
0

우리는 프로세스가 3 개 있고, 순서에 따라 특정 파일에 기록한다고 가정합니다. 프로세스가 파일을 쓰려고 할 때 (쓰기 중일 때), 다른 파일 2 프로세스가 문제가 발생하면 프로세스 순서를 제어하는 ​​서버 프로세스를 추가하고 프로세스가 닫히면 이벤트가 발생하므로 프로세스가 닫힐 때이 이벤트에서 어떻게 소스 (파일 액세스)를 릴리스 할 수 있습니까? File.Release(FilePath);파일에 대한 액세스 해제

편집 비슷해 :

쓰기는 다음과 같은 파일로 :

try { 
     if(!File.Exists(FilePath)) 
      throw new Exception("File does not Exist."); 

     bool Clear = false; 
     using(StreamReader sr = new StreamReader(FilePath)) { 
      if(sr.ReadToEnd().Length > 1200) 
       Clear = true; 
      } 

     if(Clear) 
      using(StreamWriter sw = new StreamWriter(FilePath, false)) { 
       sw.WriteLine(Text); 
       sw.Flush(); 
     } else 
      using(StreamWriter sw = new StreamWriter(FilePath, true)) { 
       sw.WriteLine(Text); 
       sw.Flush(); 
     } 
} catch(Exception ex) {} 
+1

은 파일에 쓰는 코드를 보여줍니다. 기본적으로 파일에 쓸 때 쓰기 권한이있는 파일에 대한 핸들을 엽니 다. 아무도 그 파일에 쓸 수 없습니다. 하지만 일단 쓰기가 끝나면 핸들을 해제해야합니다 (일반적으로 Dispose 또는 Close를 호출하거나 코드를'using '블록에 넣음). – oleksii

+0

@oleksii I Update it 질문을 참조하십시오. – Saeid

+0

Oleksii가 말했듯이 "using"이라는 키워드를 사용하십시오. 그것은 암묵적으로 일을 끝낼 때 핸들을 유지하고 처분 할 Idisposable을 의미합니다. 그게 최선의 방법입니다. 이는 데이터베이스 연결에 사용 된 것과 동일한 f}으로 사용됩니다. – King

답변

5
using System.IO; 

class Program 
{ 
    static void Main() 
    { 
      using (StreamWriter writer = new StreamWriter("important.txt")) 
      { 
       writer.Write("Word "); 
       writer.WriteLine("word 2"); 
       writer.WriteLine("Line"); 
      } 
    } 
} 

이 "사용"을 사용, 키워드를 말 할 때 우리가 의미 예제 유형입니다. streamwriter를 명시 적으로 닫지 말고 명시 적으로 처리하지 마십시오. 사용하면 모든 마법이 당신을 위해 해줍니다. 이 작업은 작업이 완료 될 때와이 사용 블록을 벗어날 때를 처리합니다.

close 또는 dispose를 명시 적으로 사용하면 멀티 스레드 환경에서 이전 스레드가 방금 처리 한 스레드가 개체를 열려고 시도 할 수 있다는 점을 고려하면 스레드에 문제가 발생합니다. 스레드를 동기화하는 데 문제가 있습니다. 이것은 데이터베이스에 여러 개의 연결이있는 서버 응용 프로그램에서 일반적으로 직면하는 것과 동일한 문제입니다. 그것이 Idisposable에서 이와 같이 사용해야하는 이유입니다.

C# USING keyword - when and when not to use it?

이것에 대해 자세히 설명합니다.

업데이트 : 한 번에 여러 파일을 작성하는 클라이언트가 문제가됩니다. 위의 사람들에 의해 말했듯이, 두 가지 프로세스는 쓰기 모드에서 같은 파일을 동시에 보유 할 수 없습니다. 대용량 데이터를 작성하는 경우 대기해야합니다. 대기하는 시간은 현저하게 현저합니다. 또는 클라이언트에서 오브젝트를 수집하여 대기열에 넣고 실제로 서버에서 쓸 수 있습니다. 서버에있는 파일에 대한 쓰기 액세스 권한을 클라이언트에 부여하는 것도 피할 수 있습니다. 데이터가 직렬화되면 Google 프로토콜 버퍼를 사용하여 데이터를 전달할 수 있습니다.

클라이언트에서 파일을 처리하는 중이고 클라이언트 프로세스가 중간에 종료되면 파일에 대한 쓰기 핸들이 없으므로 다른 프로세스가 자유롭게 처리 할 수 ​​있습니다 쓰기 액세스.

관련 문제