2008-10-20 3 views
1

XML 매니페스트에 쓰는 사용자 지정 응용 프로그램 (소스가 우리가 제어 할 수없는 사용자)의 진행 상황을 모니터링하고 있습니다. 때로는 매니페스트 파일에 쓸 수 없기 때문에 응용 프로그램이 멈췄습니다. File.Close를 사용하여 파일 핸들을 명시 적으로 닫고 Using Blocks에서 파일 변수를 만드는 방법으로 추적을 다루고 있습니다. 그러나 어떻게 든 그것은 계속 일어나고 있습니다. (우리의 응용 프로그램은 다중 스레드이며 최대 세 개의 스레드가 파일에 액세스하고있을 수 있습니다.) 또 다른 흥미로운 점은 응용 프로그램에서이 항목이 항목, 항목 삭제, 항목 완료의 세 가지 다른 이벤트로 업데이트된다는 것입니다. 이벤트 (항목 완료). 내 코드는 여기파일 차단 방지 방법

using (var st = new FileStream(MenifestPath, FileMode.Open, FileAccess.Read)) 
{ 
    using (TextReader r = new StreamReader(st)) 
    { 
     var xml = r.ReadToEnd(); 
      r.Close(); 
      st.Close(); 
      //................ Rest of our operations 
    } 
} 
+0

다음 링크가 도움이되기를 바랍니다. http://stackoverflow.com/questions/119548/problem-in-writing-to-single-file-in-web-service-in-net – pradeeptp

+0

정확히 할 일 - 잠금을 사용하므로 스레드가 시도하지 않습니다. 같은 시간에 파일에 액세스 할 수 있습니다. 동일한 파일에 여러 스레드가 로깅되어있을 때 나를 위해 일했습니다. 파일 액세스를 관리하기위한 라이브러리를 만들고 당신은 황금색입니다. – ScottCher

답변

2

파일에서 읽기만하는 경우 공유 모드를 지정하는 플래그를 전달할 수 있어야합니다. .NET에서 어떻게 지정했는지 모르겠지만 WinAPI에서는 FILE_SHARE_READ | FILE_SHARE_WRITECreateFile()으로 전달합니다.

파일 API 문서에서 공유 모드가 언급 된 위치를 확인하시기 바랍니다.

+0

그래 FileShare 상수가 있습니다. 고마워 내가 그것을 시도하고 작동하는 방법을 참조하십시오. – Gripsoft

+0

감사 FileShare 상수를 추가하면 응용 프로그램의 스레드가 서로 이해하는 것 같습니다. 우리의 응용 프로그램은 그냥 읽고 그래서 나는 다른 파일에 대한 READ_WRITE 특성을 사용했습니다. 그들의 응용 프로그램은 항상 파일을 열립니다. – Gripsoft

0

내가 하나 개의 프로세스를 언급 한 바와 같이하면서 그 사람이 NO SOURCE의 ACCCESS 함께 타사을 모든 프로세스에 대한 파일 액세스에 대한 모든 권한을 갖는되기 때문에 문제가 다르다 나열됩니다. 그리고 우리의 응용 프로그램은 잘 작동합니다. 그러나 파일의 제어권을 가질 수 없다면 응용 프로그램이 작동하지 않는 것 같습니다. 그래서 나는 그들의 실행을 방해하지 않는 파일 액세스 방법을 찾고자합니다.

1

두 가지 :

  1. 당신은 using 문장의 범위 밖에서 작업의 나머지 부분을 수행해야합니다. 이렇게하면 닫힌 스트림과 독자를 사용하지 않아도됩니다. 또한 Close 메서드를 사용할 필요가 없습니다. using 문의 범위를 끝내면 Dispose이 호출되므로 해당 메서드가 필요하지 않습니다.
  2. FileShare 열거 형을 가진 오버로드를 사용해야합니다. 잠금은 본질적으로 편집 적이므로 파일이 자동으로 잠겨서 자신을 보호 할 수 없습니다. :)

HTH.

0

다른 스레드가 쓰는 동안 한 스레드가 파일에서 읽으려고 시도하는 경우 이런 일이 발생할 수 있습니다. 한 번에 하나의 작성자 만 여러 독자를 필요로하는 이런 유형의 상황을 피하려면 Reader.WriterLock 또는 .NET 2.0에서 System.Threading 네임 스페이스의 ReaderWriterLockSlim 클래스를 사용하십시오. 또한

0

, 당신은 닷넷 2.0을 사용하는 경우, 당신은 당신의 코드를 단순화 할 수는합니다 :

string xmlText = File.ReadAllText(ManifestFile); 

은 참조 : File.ReadAllText on MSDN.

관련 문제