Функция CComboBox :: Dir не выводит каталог, если атрибут Archive не установлен и атрибут Index установлен - PullRequest
3 голосов
/ 05 сентября 2011

Я использую CComboBox :: Dir (DDL_READWRITE, путь) для заполнения содержимого комбинированного списка.Все хорошо, но когда я сбрасываю флаг Archive и устанавливаю флаг Index, Dir () не возвращает файлов.Я использую

attrib -A *.*
attrib +I *.*

в каталоге, который я перечисляю.Я попытался изменить первый параметр на функцию Dir (), но это не помогает.Я пробовал FindFirstFile () / FindNextFile (), и они работают нормально

Есть идеи, чтобы объяснить причину этого поведения?Может ли это быть ошибкой в ​​функции Dir ()?Если да, на какие другие функции это может повлиять?Как решить эту проблему?

1 Ответ

0 голосов
/ 04 января 2012

Это довольно интересный вопрос. Я отладил его на Win 7 64 Bit в код ассемблера ListBox_DirHandler comctl32.dll и обнаружил, что Windows делает что-то вроде этого (просто упрощенный код):

// attr is the low word of the parameter passed to CComboBox::Dir.
attr &= FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL;
attr |= FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_READONLY;

WIN32_FIND_DATA finddata;
FindFirstFile(..., &finddata)
while(...) {
  if(finddata.dwFileAttributes == FILE_ATTRIBUTE_COMPRESSED)
    finddata.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
  if(finddata.dwFileAttributes & attr) {
    // some more checks and then might add the file name to the control;
  }
  FindNextFile(..., &finddata);
}

Проблема в том, что ваш файл возвращается с finddata.dwFileAttributes==FILE_ATTRIBUTE_NOT_CONTENT_INDEXED. При входе в функцию attr изменяется так, что никогда не может быть установлен FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, поэтому if внутри цикла никогда не будет истинным, а имя файла никогда не будет добавлено в элемент управления.

Извините, но, насколько я вижу, вам придется дождаться исправления MS или выполнить работу самостоятельно.

...