2009-09-11 7 views
0

DotNetZip 라이브러리를 사용하여 폴더의 파일을 압축합니다. 현재 다른 프로세스에서 열려있는 파일을 식별하기 위해 SysInternals.com에서 'handle.exe'를 사용하고 있습니다. 필자는 매개 변수를 사용하여이를 호출하고 출력을 파싱하여이 작업을 수행합니다.관리 코드의 파일에 대한 프로세스 핸들 및 잠금 확인

using (Process handleProcess = new Process()) 
{ 
    // -- Set up the parameters and call the process. 
    handleProcess.StartInfo.FileName = "handle.exe"; 
    handleProcess.StartInfo.UseShellExecute = false; 
    handleProcess.StartInfo.RedirectStandardOutput = true; 
    handleProcess.StartInfo.Arguments = "-u " + fileName; 
    handleProcess.Start(); 
... 

작동하지만 공기에 대해서는 불쾌감이 있습니다. 누구든지 관리되는 코드에서 더 나은 접근 방식을 제안 할 수 있습니까?

답변

0

See the answers in a similar question asked on SO. 다른 질문 using interop was suggested (그리고 다른 사람이 SysInternals도 제안했습니다).

무엇을 하든지간에 재시도 논리가 필요합니다. 재 시도해야하기 전에 어댑터를 작성했습니다. 재시도 로직 자체는 다른 알고리즘 (예 : 선형 지연, 스테핑 지연 등)에 대한 하위 클래스가있는 RetryTracker 클래스에 캡슐화되었습니다.

1

다음 코드는 당신에게 다른 프로세스에 의해 열린 파일을 보여줍니다

SelectQuery query = new SelectQuery("select name from cim_datafile"); 
using (ManagementObjectSearcher searcher = new 
ManagementObjectSearcher(query)) 
{ 
    foreach (ManagementObject mo in searcher.Get()) 
    { 
     Console.WriteLine("File Name: {0} \nIs currently opened", mo.Properties["Name"].Value); 
    } 
} 

그것은 this의 약간 수정 된 버전입니다.

관련 문제