2010-02-25 4 views
3

네트워크 공유에 저장된 파일을 읽는 프로세스가 많습니다. 원래 한 프로세스 만 파일을 읽을 수 있었고 다른 모든 프로세스는 예외를 던질 수있었습니다. 때로는 여러 프로세스가 여전히 파일을 액세스 할 수 없기 때문에, 그러나 여전히 문제가있는 것,여러 프로세스가 동일한 파일을 읽는 올바른 방법은 무엇입니까?

using (StreamReader fileStreamReader = new StreamReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))) 
{ 
    content = fileStreamReader.ReadToEnd(); 
} 

이 여러 프로세스가 동일한 파일을 읽을 수 있도록 : 그 처리하는 다음 코드를 구현했습니다. 그러나 나중에 파일을 사용하지 않을 때 다시 돌아가서 잘 열 수 있습니다. 지금 당장은 무작위 지연을 구현 한 재시도 동작이 있습니다. 이런 식으로하는 것은 다소 기발한 것 같습니다. 그래서 더 좋은 방법은 무엇일까요?

이것은 이상한 부분입니다. 파일 IO가 아닌 예외는 CommStudio라고하는 라이브러리에서 가져온 것입니다. 간단히 말해, 파일을 문자열로 덤프하고 약간 수정 한 다음 메모리 스트림으로 덤프하고 ymodem을 통해 rs232에 제공합니다. 예외는 원격 시스템이 취소되었음을 알려줍니다. 데이터를 가져 오는 장치는 전송 오류가 있음을보고합니다. 이는 일반적으로 불완전한/빈 파일이 수신되었음을 나타냅니다.

일반적으로 나는이 라이브러리를 비난 하겠지만 책상 테스트와 파일 액세스 프로세스가 하나 일 때 완벽하게 작동합니다. 실제로 일관성있는 것으로 보이는 유일한 점은 여러 프로세스가 파일에 액세스 할 때 실패 할 가능성이 크다는 것입니다.

+0

네트워크 공유에서 잠금은 피타가 될 수 있습니다. 어떤 네트워크 공유 (윈도우 버전, 유닉스)를 사용하고 있고 어떤 예외가 있는지 말할 수 있습니까? – stmax

+0

클라이언트는 XP를 사용하고 있습니다. 서버는 Windows Server입니다.하지만 2008 년은 그렇다고 생각합니다. 예외에 대한 수정 사항을 게시하고 있습니다. – MGSoto

+1

항상 동일한 파일을 읽고 있습니까? 파일을 읽은 후 올바르게 읽었는지 확인하기 위해 체크섬 (예 : SHA1 클래스 참조)을 계산할 수 있습니다. 체크섬이 맞으면 장치에서 오류가 발생했으며 네트워크 공유에서 읽는 것이 아닙니다. – stmax

답변

2

도 비슷한 문제가 있었지만 이상적인 해결책을 찾을 시간이 없었습니다. 나는 webservice를 만들고 webservice 응용 프로그램에 로컬 파일을 붙였다. 그런 다음 사무실 인트라넷을 통해 호출 된 간단한 하나의 라이너 GET API를 만들었습니다. 따라서 호출 응용 프로그램 만 로그 파일을 편집 할 수 있습니다. 지저분하면서도 기능적입니다.

+0

흥미로운 솔루션. 나는 그런 것 같지만 그 해결책에 대해 너무 많은 표를 얻지는 않을 것이라고 생각합니다. 그러나 그것은 모든 프로세스를 제어하는 ​​마스터 프로그램을 가지고 있기 때문에 나에게 아이디어를 제공합니다. 그리고 프로세스가 필요로하는 파일을 프로세스에 공급할 수 있습니다 ...하지만 결국에는 실행중인 여러 개의 프로세스가 있습니다. 보장 된 해결책을 찾아야합니다. – MGSoto

0

저는 과거에도 비슷한 문제가있었습니다. 이런 식으로 파일에 액세스하는 방법을 변경해보십시오.

//Use FileInfo to get around OS locking of the file 
FileInfo fileInfo = new FileInfo(path); 
//I actually wanted unblocked read write access so change your access and share appropriately 
using (FileStream fs = fileInfo.Open(FileMode.Open, FileAccess.Write, FileShare.ReadWrite)) 
{ 
    //I'm using CopyTo but use whatever method matches your need 
    fileInfo.CopyTo(Path.Combine(destination, fileName), false); 
} 
관련 문제