2014-10-08 11 views
0

나는 이것이 일반적인 질문이라는 것을 알고 있지만 나는 이것을 토론을 위해 여는 중이다. 나는 다른 누군가가 비슷한 일을 수행했다고 가정해야만하고 내 솔루션이 작동하지 않는다는 것을 알기 위해 많은 코드를 작성하고 싶지는 않습니다.filesystemwatcher는 파일을 모니터하는 올바른 방법입니까?

다음은 내가 가지고있는 것입니다. 사용자는 데이터베이스에 OLE 객체로 파일을 추가하고 파일에 대한 태도를 연결합니다. 프로젝트와 관련된 버전 등입니다. Access를 사용하고 있습니다. 고객 선택이 아닙니다!

편집하고 싶을 때 확인해야합니다. 이 단계에서 파일을 모니터링하고 파일을 저장할 때 다시 데이터베이스로 복원하려고합니다.

파일 시스템 감시자가 최선의 방법이라고 생각합니다. 변경 사항을 모니터링하고 변경 사항이 트리거되었을 때 데이터베이스에 다시 저장하면 파일에 액세스 할 수 있습니다. 그것이 여전히 열려있는 경우 응용 프로그램이 잠겨 사용자가 완료되지 않았 음을 알게됩니다.

그래서 짧은 내 질문에 파일 시스템 감시자이 접근하는 적절한 방법은 무엇입니까? 누구든지 다른 것을 제안합니까?

감사합니다, 짐

+0

사용자가 데이터베이스에 레코드를 추가한다는 것을 의미합니까? 그렇다면 간단한 쿼리를 작성하십시오 .. 아니면 그들 자신의 액세스 db 파일을 추가하고 있습니까? 그렇다면 Create 또는 Modify 속성의 FileWatacher를 검사하거나 액세스 할 수 있습니다 .. 설명을 위해 더 구체적으로 작성하십시오 – MethodMan

+0

@DJKRAZE - 사용자가 데이터베이스에 레코드를 추가합니다.이 중 일부는 OLE 개체 또는 attactment. 데이터베이스에서 파일을 "체크 아웃"하여 작업 할 때,이 파일을 모니터링해야합니다. –

답변

3

M4GNV5가 말하듯이 FileSystemWatcher이 작동하지만 과장됩니다. 하나를 사용하는 것은 꽤 오류가 발생하기 쉽고 매우 정확한 사용 패턴이 필요하기 때문에 코드에 상당히 관련되어 있습니다. 또한 커널 모드에서 파일 시스템 드라이버에 연결해야하기 때문에 일정한 오버 헤드가 있습니다.

대체 솔루션은 폴링을 사용할 수 있습니다.

FileInfo info = new FileInfo(filePath); 
DateTime oldTime = info.LastWriteTimeUtc; 

while(true) 
{ 
    do 
    { 
     await Task.Wait(1000); 
     info.Refresh(); 
    } while(info.LastWriteTimeUtc == oldTime); 

    try 
    { 
     using(Stream s = File.OpenRead(filePath)) 
     { 
      // ok, file was modified and is unlocked. copy back. 
     } 

     break; 
    } 
    catch(IOException) 
    { 
     // file is locked, retry. 
     oldTime = info.LastWriteTimeUtc; 
    } 
} 

먼저 파일의 수정 시간이 변경 될 때까지 기다린 다음 잠금이 해제되는지 확인합니다.

+0

감사합니다. 모든 접근 방식보다 간단합니다. 먼저 파일 시스템 감시를 시작하기 전에 물어 줘서 다행입니다. 제가 제대로 작동한다고 믿었다면 모든 문제를 해결할 시간과 노력이 많이 필요할 것 같았습니다. –

+0

관심이 있다면 Rx 프레임 워크를 사용하는 코드가 있습니다. 조금 쉬워 보이지만 여전히 단순하지는 않습니다. https://idcomlog.codeplex.com/SourceControl/latest#IdComLog.Reactive/FileSystem.cs –

+0

감사합니다. –

2

단일 파일이나 디렉토리를 모니터링 하시겠습니까?

은 FileSystemWatcher는 http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx가 defnitly 올바른 선택 전체 디렉토리를 모니터링하는 지금은 FileSystemWatcher 영업 이익 될 수있는 하나의 파일을 모니터하기 위해하지만 위해 당신에게

지시로 디렉토리를 볼 수 있도록 설계되었습니다

+0

그렇다면 단일 파일을 모니터링 할 때 무엇을 제안 하시겠습니까? – Asik

+0

나는 그것이 문제에 달려 있다고 생각한다. Tim은 사용자가 파일을 편집하는 한 잠긴다 고 말했습니다. 제 생각에 가장 좋은 방법은 타이머를 설정하고 매 x 초마다 쓰기 모드로 파일을 열어 잠그는 지 확인하는 것입니다. – M4GNV5

0

만약에 그들은 응용 프로그램 내에서 저장을 클릭하지만 닫지는 않습니까? 감시자가 변경 내용을보고 한 후에도 파일이 잠겨져 읽을 수 없지만 편집기에 따라 다릅니다.

또 다른 방법은 직접 편집 응용 프로그램을 실행하고 사용자가 응용 프로그램을 닫을 때 프로세스를 모니터링하는 것입니다. 동일한 프로세스에서 둘 이상의 문서를 여는 탭 편집기에서 문제가 발생할 수 있습니다.

신뢰성을 위해 FTP 클라이언트와 같은 응용 프로그램은 일반적으로 timed 루프를 사용하여 파일 크기 및 변경된 속성을 모니터링하고 변경 한 파일을 처리합니다.

변경 사항이 발생한 후 바이러스 스캐너가 파일을 잠그고 검색 할 수 있으므로 코드가 즉각적인 액세스를하지 못하게하므로 조치를 취하기 전에 지연이 필요할 수도 있습니다.

+0

@WholsRich - 편집 응용 프로그램이 어떤 응용 프로그램이 될지도 모른다는 문제가 있습니다. 사용자가 데이터베이스에 체크인 할 수있는 파일에 대한 제한이 없으므로 작업, Excel, 이미지 등이 될 수 있습니다. –

+0

루프 체크는 현명한 선택이며 논리가 깨질 수 있음을 명심하십시오. 사용자는 여러 파일을 어떻게 열 것인지, 오래된 사무실 컴퓨터는 업데이트되는 lastWrite와 출시 될 파일 사이의 지연과 함께 느려질 수 있습니다. – WhoIsRich

+0

나는 더 많은 것을 생각하고있었습니다. 적은 자신이지만 행운이 있어도 연중 무휴로 실행해야하는 앱에 대한 경험이 있습니다. –

1

FileSystemWatcher를 사용하여 단일 파일을 모니터링 할 수 있습니다. Filter 속성을 원하는 특정 파일로 설정할 수 있습니다. 또는 *로 설정할 수 있습니다.MDB (또는 유사) 및 변경 이벤트가 당신이 관심을 가지고있는 파일의 경우에만 일을 할 수있는 FileSystemEventArgs에게 경로를 비교

코드는 의사 :. 그들이 파일을 체크 아웃 할 때

  • 에 그것을 만들 파일 시스템과 일치하는 필터가있는 파일 시스템 감시자를 만들고 변경된 이벤트에 가입하십시오.
  • Changed 이벤트에서 파일에 액세스 할 수 있는지, 즉 잠금이 해제되었는지 여부와 그 잠금이 해제되었는지 여부를 확인하십시오 너를하고 싶니?

이것이 최고의 솔루션입니까? 실제로 몇 가지 요인에 따라 다릅니다. 그들은 진행중인 작업을 저장할 수 있으므로 파일을 잠근 상태로두고 다시 저장하지 않고 종료 할 수 있습니까? 그렇다면 두 번째 Changed 이벤트를 얻지 못할 것입니다.

그렇듯이 폴링 (타이머에서 파일의 상태를 확인하고 마지막으로 수정 된 속성이 변경되었는지 여부)이 더 나은 해결책 일 수 있습니다.

+0

코리 넬슨도 같은 접근 방식을 제안했습니다. 이것이 바로 파일 시스템 감시자를 먼저 만나다 전에 내가 질문을 게시 한 이유입니다! –