2011-07-04 2 views
2

우리 소프트웨어를 실행하는 현장에 Windows CE 5 장치가 많이 있습니다.Compact framework - 디렉토리 내용을 읽을 수 없습니다. - winioerror

일부 임무는 일부 디렉토리를 압축하여 서버에 전송하는 것입니다.

약 3 개의 (수백 개의) 장치에서 디렉토리를 압축하려고 할 때이 오류가 계속 발생합니다. 압축 프로세스에는 모든 하위 디렉토리로 내리고 파일을 추가하는 작업이 포함됩니다.

System.IO.IOException: IOException 
    at System.IO.__Error.WinIOError(Int32 errorCode, String str) 
    at System.IO.Directory.InternalGetFileDirectoryNames(String fullPath, Boolean file) 
    at System.IO.Directory.InternalGetDirectories(String path, String searchPattern) 
    at System.IO.Directory.GetDirectories(String path, String searchPattern) 

이 것은이 장치에서 매번 발생하며 무작위가 아닙니다.

내 개발 장치에 디렉터리 내용을 복사하고 같은 디렉터리 내용으로 동일한 내용을 실행해도 오류가 발생하지 않습니다. 대화 형으로 디버깅 할 실제 장치가 없습니다.

물론이 WinIOError는 실제 원인을 결정하는 데별로 유용하지 않습니다. 아무도 나에게 CF가 디렉토리 내용을 읽으려고 할 때 매우 실패 할 수있는 원인에 대한 힌트를 줄 수 있습니까?

아래에서 볼 수 있듯이 더 이상 존재하지 않는 디렉토리와 같은 일반적인 사항은 일반적인 WinIOError가 아닌 해당 효과의 예외에 의해 처리됩니다.

모든 단서를 보내 주셔서 감사합니다.

// System.IO.Directory 
    internal static string[] InternalGetFileDirectoryNames(string fullPath, bool file) 
    { 
     char c = fullPath[fullPath.Length - 1]; 
     if (c == Path.DirectorySeparatorChar || c == Path.AltDirectorySeparatorChar || c == Path.VolumeSeparatorChar) 
     { 
     fullPath += '*'; 
     } 
     string[] array = new string[10]; 
     int num = 0; 
     HostNative.FIND_DATA fIND_DATA = new HostNative.FIND_DATA(); 
     if (!Directory.Exists(Path.GetDirectoryName(fullPath))) 
     { 
     throw new DirectoryNotFoundException(); 
     } 
     int handle; 
     int num2 = PAL.File_OpenAndReadDir(fullPath, out handle, fIND_DATA); 
     if (num2 != 0) 
     { 
     if (num2 == -2147479552 || num2 == -2147479545) 
     { 
      return new string[0]; 
     } 
     __Error.WinIOError(num2, Path.GetDirectoryName(fullPath)); 
     } 
     int num3 = 0; 
     do 
     { 
     bool flag; 
     if (file) 
     { 
      flag = (0 == (fIND_DATA.dwFileAttributes & 16)); 
     } 
     else 
     { 
      flag = (0 != (fIND_DATA.dwFileAttributes & 16)); 
      if (flag && (fIND_DATA.cFileName.Equals(".") || fIND_DATA.cFileName.Equals(".."))) 
      { 
      flag = false; 
      } 
     } 
     if (flag) 
     { 
      num3++; 
      if (num == array.Length) 
      { 
      string[] array2 = new string[array.Length * 2]; 
      Array.Copy(array, 0, array2, 0, num); 
      array = array2; 
      } 
      array[num++] = fIND_DATA.cFileName; 
     } 
     num2 = PAL.File_ReadDir(handle, fIND_DATA); 
     } 
     while (num2 == 0); 
     PAL.File_CloseDir(handle); 
     if (num2 != 0 && num2 != -2147479545) 
     { 
     __Error.WinIOError(num2, Path.GetDirectoryName(fullPath)); 
     } 
     if (!file && num3 == 1 && (fIND_DATA.dwFileAttributes & 16) != 0) 
     { 
     return new string[] 
     { 
      fIND_DATA.cFileName 
     }; 
     } 
     if (num == array.Length) 
     { 
     return array; 
     } 
     string[] array3 = new string[num]; 
     Array.Copy(array, 0, array3, 0, num); 
     return array3; 
    } 

답변

0

물리적으로 깨진 저장 매체는이 발생할 수 있습니다 :

아래는 분해 기능입니다. 혹시 SD 카드가 저품질인가요?

+0

생각은 있지만,별로 좋지 않은 것은 아닙니다. 엔지니어가 문제의 재현을 시도 할 수 있도록 랩톱에 전체 SD 컨텐츠를 성공적으로 복사하도록했습니다. 표면적으로 볼 때 물리적 인 문제는없는 것처럼 보입니다. 왜냐하면 그것은 모두 읽을 수 있기 때문입니다. – Nik

+0

@Nik :하지만 SD 카드 IO가 실패합니까 (또는 장치 플래시 메모리)? SD 카드 인 경우 탐색기에서 마우스 오른쪽 버튼을 클릭하고 속성을 선택하여 드라이브에서 사용할 수있는 오류 검사 도구를 사용하여 데스크탑에서 실패한 카드를 확인하십시오. 그곳에 있었고, 그 문제를 보았습니다. –

+0

예 - SD 카드입니다. 고마워요. 저는 엔지니어에게 그 일을시키기 위해 노력할 것입니다. 그러나 SD 카드가 랩톱에서 완벽하게 읽을 수 있다고 생각합니까? 오류는 발생시키지 않지만 장치는 그렇지 않습니다. – Nik