Компактная структура - не может прочитать содержимое каталога - winioerror - PullRequest
2 голосов
/ 04 июля 2011

У меня есть много устройств на базе Windows CE 5, работающих под нашим программным обеспечением.

Часть их обязанности - заархивировать некоторые каталоги и отправить их на сервер.

Примерно на 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;
    }

1 Ответ

0 голосов
/ 04 июля 2011

Физически испорченный носитель может вызвать это.Низкокачественная SD-карта, случайно?

...