2015-01-22 3 views
4

두 파일 형식 중 하나가 전체 Windows 파일 시스템에서 어떤 식 으로든 액세스되는 경우이를 감지해야합니다.특정 파일 형식의 파일 시스템 필터 드라이버

운영체제의 성능 저하없이이 작업을 수행하는 유일한 방법은 파일 시스템 필터 드라이버를 만드는 것입니다.

필자가해야 할 일은 열려있는 모든 doc (x) 파일과 pdf 파일의 복사본을 가져 오는 것입니다. 이 방법을 사용하기로 결정했거나 전체 드라이브에 효과적이지 않은 C#의 파일 모니터를 사용했습니다.

제 질문은 두 가지입니다. 쉬운 방법이 있습니까? 둘째, 각 문서 (x)/pdf 파일의 복사본을 가져 오는 방법은 무엇입니까?

솔루션은 현재 제작중인 패키지와 함께 배포 할 수 있어야합니다.

UPDATE

내가 여기에 나는 그것이 허용 될 수 있다고 가능하다고 생각 사람들과 논의 후, 벤치 마크에 파일 시스템 감시자 갈거야, 내 관심사는 내가 일반 사용자 디렉토리를 모니터링 할 필요가 있다는 사실이다 (C : \ Users \ SomeUser *)와 Outlook 임시 폴더

+0

파일 시스템 드라이버가 당신을 구입할 수있는 유일한 방법은 업데이트를 제한하여 Firehose 문제를 처리 할 수있는 방법입니다. 그러나 그러한 드라이버는 명시 적으로 원하지 않는 문제, 심각한 시스템 감속을 만듭니다. 귀하의 요구 사항은 파일이 액세스 될 때만 사본을 작성하는 매우 이상한 것입니다. 당신은 FSW로 그것을 할조차 수 없다, 그것은 변화를 감지하기 위해 만들어졌다. 합리적인 대안은 항상 사본을 가져 오는 것입니다. 볼륨 섀도 복사본 서비스를 조사해야합니다. –

+0

이러한 파일을 여는 패키지를 생성하는 경우 파일을 열 때 복사를하지 못하는 이유는 무엇입니까? – Plutonix

+0

안녕하세요, 본질적으로 소프트웨어는 OS에 도착할 때 문서 사본을 필요로합니다. 전체 OS, IE Outlook 임시 폴더, 다운로드 폴더 등보다 엔트리 포인트를 모니터링 할 수 있다고 생각합니다. –

답변

2

파일 시스템 감시자를 만들어야합니다. 다음은 docx 파일의 변경 사항을 확인하는 코드 예제입니다. .

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Security.Permissions; 

namespace filewatchtest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Run(); 
     } 

     [PermissionSet(SecurityAction.Demand, Name="FullTrust")] 
     public static void Run() 
     { 
      string[] args = System.Environment.GetCommandLineArgs(); 

      // if directory not specified then end program 
      if (args.Length != 2) 
      { 
       Console.WriteLine("Usage: filewatchtest.exe directory"); 
       return; 
      } 

      // create a new fileSystemWatcher and set its properties 
      FileSystemWatcher watcher = new FileSystemWatcher(); 
      watcher.Path = args[1]; 

      // set the notify filters 
      watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; 

      // set the file extension filter 
      watcher.Filter = "*.docx"; 

      // add event handlers 
      watcher.Changed += new FileSystemEventHandler(OnChanged); 
      watcher.Created += new FileSystemEventHandler(OnChanged); 
      watcher.Deleted += new FileSystemEventHandler(OnChanged); 
      watcher.Renamed += new RenamedEventHandler(OnRenamed); 

      // bengin watching 
      watcher.EnableRaisingEvents = true; 

      // wait for the user to quit the program 
      Console.WriteLine("Plress q to quit the program"); 
      while (Console.Read()!='q'); 


     } 

     static void OnRenamed(object sender, RenamedEventArgs e) 
     { 
      Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath); 
     } 

     static void OnChanged(object sender, FileSystemEventArgs e) 
     {    
      Console.WriteLine("File:" + e.FullPath + " " + e.ChangeType); 
     } 



    } 
} 
+0

안녕하세요 앤드류, 불행히도 전체 드라이브에서 파일 시스템을 사용하여 답장을 보내 주셔서 감사합니다. –

+0

그 위에 LastAccess는 이제 Windows 파일 시스템에서 사용할 수 없으므로 위에 언급 한 내용은 아마 잘 작동하지 않을 것입니다! –

+0

죄송합니다. 마지막 코멘트를 다시 읽었을 때 약간의 실례가 있었지만, 감사의 말씀을 전합니다.하지만 FS watcher는 제대로 작동하지 않을 것이라고 생각합니다. –

2

i 번째 읽을 때 사본을 만드는 잉크로 인해 많은 문제가 발생합니다. 예 : 바이러스 스캐너. 다음 고려 :

  1. 내가 파일을 열 수 "있는 test.pdf을"
  2. 여러분의 프로그램은 "test_copy.pdf"
  3. 새로운 파일 검사 (읽기)
  4. 바이러스 스캐너 감지 "test_copy.pdf"
  5. 를 생성 여러분의 프로그램은 읽기 액세스를 감지하고 다른 확장자로 된 사본을 생성 할 수 당연히 지금 당신을 "test_copy_copy.pdf"
  6. 바이러스 스캐너 ...

를 생성 이 문제를 방지하지만 여전히 파일에 많은 READ 작업이 있습니다. 실수로 파일을 닫았거나 방금 읽은 파일을 다시 확인하려고하기 때문에 때때로 10 번 같은 파일을 엽니 다. 이제 10 장이 있습니까?

변경/생성시 사본을 만드는 한스 패전트 (Hans Passant)의 제안과 함께 할 것입니다. 이는 정의에 의해 훨씬 적게 발생합니다. 변경하기 위해 항상 열어야하기 때 문이지만 열 때 속성을 변경할 필요가 없기 때문입니다.

두 번째 문제는 파일에 대한 읽기를 감지하는 것입니다. 이제 docx으로 '~ $ _____. docx'와 같은 숨김 파일을 만들 수 있는지 확인할 수는 있지만 PDF에서는 작동하지 않습니다. 또한 언급 한 것처럼 전체 디스크를 검사해야합니다. 그 주위에는 방법이 없습니다. 파일이 모든 폴더에있을 수 있으면 모든 폴더를 확인해야합니다. 서비스에서 docxPDF 파일의 내부 목록을 만드는 것이 더 빠를 수 있지만 설정된 간격으로 각 파일을 다시 반복해야하므로 시스템에있는 파일 수에 따라 다릅니다.

따라서 실제로 파일 시스템 드라이버는 모두 read access인지 확인해야합니다.그러나 모든 파일 액세스에 대해 호출되므로 문제가 발생하거나 시스템 속도가 느려질 수 있습니다.

그래도이 방법을 확인하려면 File System Filter Driver Tutorial을 확인하십시오. 개인적으로, 나는 거기에 가지 않을 것이다.

+0

사실 내가해야 할 일은 새 파일을 확인하고 "트레이"응용 프로그램에서 웹 서비스로 업로드하는 것입니다. –

+0

그럼 시스템 드롭 폴더가있는 dropbox를 만들고 있습니까? 그런 다음 생성 및 변경된 이벤트에 파일 시스템 감시자를 사용하여 업로드하십시오. –

+0

전체 드라이브에서 파일 시스템 감시자를 수행 할 수 있습니까? –

1

의견에서 읽은 것으로부터 File System Watcher가 잘 작동 할 것입니다. 나는 정확히 Search Everything이 하나를 사용하는지 확신 할 수는 없지만 만약 그렇다면 어떤 영향도주지 못합니다.

Process Monitor에 의해 사용되는 다른 옵션은 ETW - Windows Event Tracing 일 수 있습니다. 수백만 가지의 변화가 있었음에도 불구하고 그 영향을 거의 눈치 채지 못합니다.

Hans Passant가 제안한 볼륨 섀도 복사본 (Alpha Volume Shadow Copies)으로 가고 싶습니다. 해당 라이브러리를 지원하는 적절한 라이브러리 일 수 있습니다.

결론 : 계층 형 스토리지 관리 시스템에 대한 설명이 하드 후 다음 계층 구조로 업로드 저장소를 생각할 때 귀하의 접근 방식과 일치 할 수 있음을 인정하지만 필터 드라이버가 필요하지 않으며 다른 문제를 피할 수 있습니다. 디스크.

관련 문제