배경은 FileSystemWatcher는 네트워크 공유에 사용할 수있는 파일을보고 있지만 파일을 찾을 수 없습니다
나는 4 개 하위 폴더와 공유 폴더 \\Server\Share
가있는 서버가 있습니다
- OutboundFinal
- OutboundStaging
- 을 InboundFinal
- InboundStaging
모든 폴더는 동일한 실제 디스크와 파티션에 있으며 연결점은 사용되지 않습니다.
또한이 공유에 파일을 쓰고 읽는 여러 WinForms 클라이언트 (최대 10 개)가 있습니다. 각 클라이언트는 여러 스레드 (최대 5 개)에서 작업하고 있습니다. 파일은 \\Server\Share\OutboundStaging
폴더에 클라이언트 (최대 50 개의 스레드까지)가 보관합니다. 각 파일에는 GUID 이름이 있으므로 덮어 쓰기는 없습니다. 파일이 완전히 작성되면 클라이언트에 의해 \\Server\Share\OutboundFinal
폴더로 이동됩니다. 동일한 서버에서 실행되는 Windows 서비스는이를 집어 들고 삭제하고 처리 한 다음 동일한 이름의 파일을 \\Server\Share\InboundStaging
폴더에 씁니다. 파일이 완전히 작성되면 서비스에 의해 \\Server\Share\InboundFinal
폴더로 이동됩니다.
이 \\ 서버 \ 공유 \ InboundFinal 폴더가 특정 스레드가 \ 서버 \ 공유에서 볼 것으로 예상 파일의 GUID 파일 이름에 설정되어있는 FileSystemWatcher.WaitForChanged(WatcherChangeTypes.Changed | WatcherChangeTypes.Created, timeOut);
FileSystemWatcher.Filter
를 사용하여 각 윈폼 클라이언트의 각 스레드에 의해 모니터링 \ InboundFinal 폴더이므로 특정 파일이 폴더에 나타날 때까지 FileSystemWatcher가 대기합니다.
FileSystemWatcher
에 대해 몇 가지 질문을 읽었으며 UNC 공유에 변경 사항을보고하지 않았습니다. 그러나 이것은 나에게 해당되지 않습니다.
내가 사용하는 코드는 다음과 같습니다
FileSystemWatcher fileWatcher = new FileSystemWatcher();
fileWatcher.Path = InboundFinalFolder;
fileWatcher.Filter = GUIDFileName; // contains full UNC path AND the file name
fileWatcher.EnableRaisingEvents = true;
fileWatcher.IncludeSubdirectories = false;
var res = fileWatcher.WaitForChanged(WatcherChangeTypes.Changed | WatcherChangeTypes.Created, timeOut);
if (!fileWatcher.TimedOut)
{
using (FileStream stream = fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) {
byte[] res = new byte[stream.Length];
stream.Read(res, 0, stream.Length);
return res;
}
그것은 예외를 던지는 사용하는 라인입니다.
인한 문제
나는 fileWatcher.WaitForChanged 적절한 GUID 이름을 가진 파일이 \\Server\Share\InboundFinal
폴더에있는 경우에만 계속할 것입니다 가정합니다. 이것은 FileSystemWatcher가 로컬 폴더에서 작동하는 방식이지만 네트워크를 통해 액세스되는 파일 공유 (공유를 통해 액세스되는 로컬 파일도 작동하는 경향이 있음)와는 다릅니다. FileSystemWatcher는 스레드가 기다리고있는 파일이 FileSystemWatcher \\Server\Share\InboundFinal
폴더에 있음을보고합니다. 그러나 파일을 읽으려고하면 FileNotFoundException이 발생합니다. 읽기 스레드는 파일을 읽기 전에 3-15 초 기다려야합니다. Read
공유를 사용하여 FileStream으로 파일을 열려고합니다.
이 문제가 발생할 수있는 이유는 무엇입니까? 어떻게 해결할 수 있습니까? 파일을 읽을 수 있거나 시간 초과가 발생하는 경우에만 FileSystemWatcher.WaitForChanged(WatcherChangeTypes.Changed | WatcherChangeTypes.Created, timeOut);
을 실행하는 것이 이상적입니다.
FileNotFoundException은 매우 기본입니다. 표준 실수는 GUIDFileName을 사용하여 파일을 여는 것입니다. 충분하지 않다. 그것은 완전한 길이 아니다. 테스트 할 때 우연히 작동하며 결코 서버에서 작동하지 않습니다. 또한 맬웨어 방지 기능을 해제하여 시도해보십시오. 파일을 검사하는 동안 파일을 숨기는 것이 좋습니다. 실제로 실패한 코드는 게시하지 않았으므로 이는 추측입니다. –
GUIDFileName 속성에는 전체 UNC 경로와 GUID 파일 이름이 들어 있습니다. 죄송합니다. 질문에 명확한 코드 스 니펫을 편집했습니다. – Daniel
예외를 throw하는 ** using ** 행입니다. – Daniel