2010-12-12 4 views
0
public static void WriteLine(string text) 
    { 
     StreamWriter log; 

     if (!File.Exists(Filename)) 
     { 
      log = new StreamWriter(Filename); 
     } 
     else 
     { 
      log = File.AppendText(Filename); 
     } 

이 메서드가 처리되는 동안 다른 프로세스에서도이 메서드를 호출합니다. "파일이 다른 프로세스에 의해 접근되었습니다"오류가 발생합니다. 이전 프로세스가 끝나기를 기다리면서이 문제를 해결하는 방법.C# 다른 프로세스에서 해당 파일을 처리하는 경우 파일에 액세스하는 방법은 무엇입니까?

답변

1

두 프로세스는 FileStream을 작성해야하며 여기에서 FileShare 쓰기 모드를 지정합니다. 그런 다음 파일이 있는지 여부를 테스트하지 않고 FileMode 추가 만 사용하면됩니다.

2

나는 op가 파일 핸들을 자유롭게 사용하고 파일에 쓸 때까지 기다리고 싶어한다고 생각한다. 이 경우 파일 핸들을 가져 와서 예외를 catch하고 다른 프로세스에서 파일에 액세스했기 때문에 예외가 발생하면 잠시 기다렸다가 다시 시도해야합니다.

public static void WriteLine(string text) 
     { 
      bool success = false; 
      while (!success) 
      { 

       try 
       { 
        using (var fs = new FileStream(Filename, FileMode.Append)) 
        { 
         // todo: write to stream here 

         success = true; 
        } 
       } 
       catch (IOException) 
       { 
        int errno = Marshal.GetLastWin32Error(); 
        if(errno != 32) // ERROR_SHARING_VIOLATION 
        { 
         // we only want to handle the 
         // "The process cannot access the file because it is being used by another process" 
         // exception and try again, all other exceptions should not be caught here 
         throw; 
        } 

       Thread.Sleep(100); 
       } 
      } 

     } 
+1

프로세스가 파일에 액세스하는 유일한 프로세스 인 경우 잠금 장치를 사용할 수도 있습니다. 그러나 위의 코드를 사용하면 여러 프로세스에서 파일 액세스를 처리하기 때문에 안전합니다. – flayn

관련 문제