فشل FindNextFile على ويندوز 64 بت؟

باستخدام 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 على XP 64 بت إرجاع هذا:

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    
    . 16-09-2008 23:12
      .. 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.

      أنا في حيرة. ما هو سبب هذا؟

      بريان

0
وأضاف تحرير
الآراء: 30

6 إجابة

There are no problems with the example code. I have another application that fails too, written in Delphi. I think I found the answer based on Kris' answer about redirection: http://msdn.microsoft.com/en-gb/library/aa364418(VS.85).aspx

0
وأضاف

فهمتك:

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 

شكرا لك على مساهمتك كريس ، التي ساعدتني في معرفة ما يجري.

تحرير: شكرا لك Ludvig جدا :-)

0
وأضاف

لقد وجدت هذا على MSDN:

إذا كنت تقوم بكتابة تطبيق 32 بت لسرد كافة الملفات في دليل وقد يتم تشغيل التطبيق على كمبيوتر 64 بت ، يجب استدعاء الدالة Wow64DisableWow64FsRedirection قبل استدعاء FindFirstFile واستدعاء Wow64RevertWow64FsRedirection بعد آخر استدعاء إلى FindNextFile . لمزيد من المعلومات ، راجع File System Redirector.

إليك الرابط

سآخذ لتحديث كود بلدي بسبب هذا :-)

0
وأضاف

هل أنت متأكد من أنها تبحث في نفس الدليل كأمر dir؟ لا يبدو أن لديهم أي ملفات مشتركة.

أيضًا ، هذه ليست المشكلة ، ولكن البطاقة البرية الصحيحة لكل "الملفات" هي *

*. * تعني "جميع الملفات التي تحتوي على واحد على الأقل. في الاسم"

0
وأضاف

Is there redirection going on? See the remarks on Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/library/aa365743.aspx

0
وأضاف
أنا قائمة الملفات في C: \ Windows \ System32 \ Drivers ولكن في الواقع الحصول على الملفات في C: \ Windows \ SysWOW64 \ Drivers :-)
وأضاف المؤلف JubbaJubba, مصدر
ما هي الملفات في C: \ Windows \ System64 \ Drivers؟
وأضاف المؤلف Kris Kumler, مصدر

هل هناك أي تحذيرات عند التجميع؟

هل أدخلت تحذيرات ALL لهذا الاختبار تحديدًا (نظرًا لأنه لا يعمل)؟

تأكد أولاً من حل التحذيرات.

0
وأضاف