2011-11-21 4 views
-3

필자는 프로젝트에 대한 백 엔드 파일 작업을 수행 할 애플리케이션을 개발했습니다.예외없이 파일 작업을 빠르게 수행하는 방법은 무엇입니까?

응용 프로그램에서 이진 파일을 작성하고 그 안에 일부 동작을 수행하여 다른 파일을 만듭니다. 그러면 데이터베이스를 업데이트하기 위해 출력 파일을 읽을 것입니다. 예를 들어

내가이 ABC.bin 파일을 쓸 것이다 고려하고 출력 파일은 모든 위에서 언급 한 행동이 10 밀리 초 단위로 수행됩니다 XYZ.bin

입니다. 그리고 저는 같은 과정을 여러 번 반복 할 것입니다. 예를 들면 100 번.

이제 문제는 파일을 찾을 수 없거나 소스 코드에서 내 응용 프로그램을 실행하는 동안 액세스가 거부 된 것과 같은 몇 가지 예외가 있습니다.

하지만 실행 파일 (.exe)로 응용 프로그램을 만든 후에 동일한 예외가 발생하지는 않습니다.

두 경우 모두 어떤 현상이 발생합니까? 실행 파일로 만든 후에 같은 일이 일어나지 않는 이유는 무엇입니까? 당신이 할 수

+0

무슨 뜻인지 확실하지 않습니다. 그러나 디버거가 연결되어 있지 않으면 예외가 많이 * 빠릅니다. – CodesInChaos

+1

소스 코드에서 (일반적으로) C# 코드를 실행할 수는 없습니다. 항상 EXE 파일을 생성합니다. 문제는 EXE 파일을 실행하는 방법의 차이 (Visual Studio 내부/외부)에 달려 있습니다. 작업 디렉토리 때문일 것입니다. –

+0

@Roger Lipscombe : 예 ... Visual Studio 내부에서 EXE를 실행하는 동안 예외가 발생하지만 IDE 외부에서 발생하지는 않습니다. –

답변

1

몇 가지 :

  • 독립형 실행 파일을 실행하면 디버거에서가 아니라 동안 만 예외를보고하는 경우, 당신의 Visual Studio에서 예외 설정을 확인합니다. Debug -> Exceptions ...로 이동 Thrown의 모든이 파일 복사를 시작하기 전에 File.Exists 방법을 사용하여 존재하는 경우 쿼리 빠를 것입니다 경우 선택하지 않은

  • 조사 있는지 확인

  • (이것은 단지 FileNotFoundException에 물론 솔루션이다) 루프 안쪽에있는 코드를 래핑하는 대신 try-catch 블록 안에 복사 루프를 감싸십시오. 그래서 같이 :

    List<string> fileNames = new List<string>() { "file1.txt", "file2.txt", ... }; 
    int i = 0; 
    try 
    { 
        for (i = 0; i < fileNames.Count; i++) 
         // do copying here 
    } 
    catch (Exception ex) 
    { 
        // log exception 
    } 
    // You can decide if to return to copying rest of the files here, from i+1 
    

이것은 모든 입력과 비용의가 각 파일에 대해 try 블록을 종료하지 않도록하기위한 것입니다.

+1

"물론 이것은 FileNotFoundException에만 해답입니다."물론 초기 단계에서는 유용하기 때문에 예외를 완전히 막을 수는 없습니다. 또한 실제로 성능이 향상되는지 확실하지 않습니다. 파일이 두 번 열리기 때문에 성능이 평균적으로 떨어지면 놀라지 않을 것입니다. – CodesInChaos

+0

나는 당신이 성능에 대해 전혀 알지 못한다는 것에 동의한다. 그래서 나는 그가 조사 할 수 있다고 말했고 어떤 주장도하지 않았다. 어쨌든, 나는 그것을 직접 시도하고 1000 회 이상의 반복 결과가 있습니다 : File.Exists 0.0036562s, 시도/개별 File.Copy 2 잡으려고.3249567s. 또한 File.Exists가 모든 것을 치료하지는 않지만 이후에는 예외가 발생할 수 있지만 미리 확인하고 try/catch 블록을 버리는 것보다 오탐 (false positive)을 얻는 것이 훨씬 낫습니다. –

+0

디버거를 연결 했습니까? 'File.Copy'의 숫자는 내가 예상했던 것보다 약 10 배 더 큽니다. 그리고 많은 시나리오에서 확인하는 대부분의 파일이 있습니다. 편집 : 그냥 테스트. 'File.Copy'는 나에게 약 200us 밖에 걸리지 않습니다. 즉, 측정 한 것보다 약 10 배 빠릅니다. – CodesInChaos

관련 문제