2012-09-20 6 views
3

저는 회사에서 사용하는 C# 프로그램을 작성 중이므로 PHP 스크립트를 실행하여 PDF 파일을 만든 다음 PDF 파일을 엽니 다. 바로 지금, 내가 가진 :while 루프를 사용하여 파일이 존재하는지 확인하십시오.

// launch the PHP page to generate my pdf report 
Process.Start(phpFile); 

// wait for the report to exist 
Thread.Sleep(waitTime); 

// open the report 
Process.Start(filePath); 

을 지금, "당신이 일을 끝낼 때 기존 파일의 희망에 지정된 시간 동안 Sleep()"전체의 팬이 아니에요. 그래서 제 질문은, 더 나은/가능하다는 do 루프를 사용하고 말을한다 :

do 
{ 
    // Do nothing until the file exists 
} while (!File.Exists(filePath)); 

답변

8

왜하지 않는 FileSystemWatcher를 사용합니까?

PathFilter 속성을 설정하고 Created 이벤트에 구독하십시오.

+2

나는이 접근법을 좋아한다. 그러나 다른 주석에 언급 된 누군가가 PDF가 완전히 작성 될 때까지 기다릴 것인가, 아니면 직접 열어 볼 수 있습니까? – MyCodeSucks

+0

좋은 질문 ... 파일이있는 즉시 이벤트가 발생한다고 생각합니다. 그렇다면 션의 대답이 해결책이 될 것입니다. –

+0

나는 이것을 사용하여 테스트했고, 그것은 놀랍게 작동했다. 고맙습니다. – MyCodeSucks

4

FileSystemWatcher을 사용하고 생성 된 이벤트를 처리하십시오. 동기가 발생하도록하려면 FileSystemWatcher.WaitForChanged을 시간 초과로 사용하십시오.

6

File.Exists을 사용할 때의 문제점은 첫 번째 프로세스에서 파일 작성이 완료되기 전에 파일이 존재할 수 있다는 것입니다. 나는 이런 식으로 대신 할 것입니다 :

// launch the PHP page to generate my pdf report 
Process generator = Process.Start(phpFile); 

// wait for the report to exist 
generator.WaitForExit(); 

// open the report 
Process.Start(filePath); 
0

파일이 어떤 식 으로든 존재하는지 확인하는 것이 더 좋은 방법이라고 생각합니다. 정해진 시간에 의존한다면 실패하거나 프로세스가 필요한 것보다 더 많이 대기하게됩니다.

0

첫 번째 프로세스의 끝을 기다리는 것은 어떻습니까?

Process p = Process.Start(phpFile); 
p.WaitForExit(); 

Process.Start(filePath); 
관련 문제