FindNextFile не работает в 64-битной Windows?

при использовании C++ Builder 2007 функции FindFirstFile и FindNextFile, похоже, не могут найти некоторые файлы в 64-разрядных версиях Vista и XP. Мое тестовое приложение 32-битное.

Если я использую их для перебора папки C: \ Windows \ System32 \ Drivers, они находят только несколько файлов, хотя их 185, когда я запускаю команду dir в командной строке. В том же примере кода перечислены все файлы в 32-разрядной версии XP.

Вот небольшой пример программы:

int main(int argc, char* argv[])
{
  HANDLE hFind;
  WIN32_FIND_DATA FindData;
  int ErrorCode;
  bool cont = true;

  cout << "FindFirst/Next demo." << endl << endl;

  hFind = FindFirstFile("*.*", &FindData);
  if (hFind == INVALID_HANDLE_VALUE)
  {
    ErrorCode = GetLastError();
    if (ErrorCode == ERROR_FILE_NOT_FOUND)
    {
      cout << "There are no files matching that path/mask\n" << endl;
    }
    else
    {
      cout << "FindFirstFile() returned error code " << ErrorCode << endl;
    }
    cont = false;
  }
  else
  {
    cout << FindData.cFileName << endl;
  }

  if (cont)
  {
    while (FindNextFile(hFind, &FindData))
    {
      cout << FindData.cFileName << endl;
    }

    ErrorCode = GetLastError();
    if (ErrorCode == ERROR_NO_MORE_FILES)
    {
      cout << endl << "All files logged." << endl;
    }
    else
    {
      cout << "FindNextFile() returned error code " << ErrorCode << endl;
    }

    if (!FindClose(hFind))
    {
      ErrorCode = GetLastError();
      cout << "FindClose() returned error code " << ErrorCode << endl;
    }
  }
  return 0;
}

Запуск его в папке C: \ Windows \ System32 \ Drivers в 64-битной XP возвращает следующее:

C:\WINDOWS\system32\drivers>t:\Project1.exe
FindFirst/Next demo.

.
..
AsIO.sys
ASUSHWIO.SYS
hfile.txt
raspti.zip
stcp2v30.sys
truecrypt.sys

All files logged.

Команда dir в той же системе возвращает это:

C:\WINDOWS\system32\drivers>dir/p
 Volume in drive C has no label.
 Volume Serial Number is E8E1-0F1E

 Directory of C:\WINDOWS\system32\drivers

16-09-2008  23:12    <DIR>          .
16-09-2008  23:12    <DIR>          ..
17-02-2007  00:02            80.384 1394bus.sys
16-09-2008  23:12             9.453 a.txt
17-02-2007  00:02           322.560 acpi.sys
29-03-2006  14:00            18.432 acpiec.sys
24-03-2005  17:11           188.928 aec.sys
21-06-2008  15:07           291.840 afd.sys
29-03-2006  14:00            51.712 amdk8.sys
17-02-2007  00:03           111.104 arp1394.sys
08-05-2006  20:19             8.192 ASACPI.sys
29-03-2006  14:00            25.088 asyncmac.sys
17-02-2007  00:03           150.016 atapi.sys
17-02-2007  00:03           106.496 atmarpc.sys
29-03-2006  14:00            57.344 atmepvc.sys
17-02-2007  00:03            91.648 atmlane.sys
17-02-2007  00:03           569.856 atmuni.sys
24-03-2005  19:12             5.632 audstub.sys
29-03-2006  14:00             6.144 beep.sys
Press any key to continue . . .
etc.

Я озадачен. Что является причиной этого?

Брайан

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
0
8 848
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы уверены, что он находится в том же каталоге, что и команда dir? Похоже, у них нет общих файлов.

Кроме того, это не проблема, но правильный подстановочный знак для «всех файлов» - *

*. * означает «все файлы с хотя бы одним. в имени»

Ответ принят как подходящий

Происходит ли перенаправление? См. Примечания к Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/library/aa365743.aspx

Какие файлы находятся в C: \ Windows \ System64 \ Drivers?

Kris Kumler 18.09.2008 23:41

Я перечисляю файлы в C: \ Windows \ System32 \ Drivers, но на самом деле получаю файлы в C: \ Windows \ SysWOW64 \ Drivers :-)

JubbaJubba 18.09.2008 23:48

Есть ли предупреждения при компиляции?

Вы включили предупреждения ВСЕ для этого конкретного теста (поскольку он не работает)?

Обязательно сначала устраните предупреждения.

С примером кода проблем нет. У меня есть еще одно приложение, написанное на Delphi, которое тоже не работает. Думаю, я нашел ответ на основе ответа Криса о перенаправлении: http://msdn.microsoft.com/en-gb/library/aa364418(VS.85).aspx

Я нашел это в MSDN:

Если вы пишете 32-битное приложение для вывода списка всех файлов в каталоге, и приложение может быть запущено на 64-битном компьютере, вам следует вызвать функцию Wow64DisableWow64FsRedirection перед вызовом FindFirstFile и вызвать Wow64RevertWow64FsRedirection после последнего вызова FindNextFile. Дополнительные сведения см. В разделе Перенаправитель файловой системы.

Вот ссылка

Из-за этого мне придется обновить свой код :-)

Понятно:

http://msdn.microsoft.com/en-gb/library/aa384187(VS.85).aspx

Когда 32-битное приложение читает из одной из этих папок в 64-битной ОС:

%windir%\system32\catroot
%windir%\system32\catroot2
%windir%\system32\drivers\etc
%windir%\system32\logfiles
%windir%\system32\spool 

Windows фактически перечисляет содержимое:

%windir%\SysWOW64\catroot
%windir%\SysWOW64\catroot2
%windir%\SysWOW64\drivers\etc
%windir%\SysWOW64\logfiles
%windir%\SysWOW64\spool 

Спасибо за ваш вклад, Крис, который помог мне узнать, что происходит.

Обновлено: Спасибо, Людвиг :-)

Другие вопросы по теме