سؤال

باستخدام 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    <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.

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

بريان

هل كانت مفيدة؟

المحلول

هل هناك إعادة توجيه مستمرة؟راجع الملاحظات على Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/library/aa365743.aspx

نصائح أخرى

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

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

إليك الرابط

سأضطر إلى تحديث الكود الخاص بي بسبب هذا :-)

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

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

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

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

هل تحولت الجميع تحذيرات بشأن هذا الاختبار بالذات (نظرًا لأنه لا يعمل)؟

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

لا توجد مشاكل مع رمز المثال.لدي تطبيق آخر فاشل أيضًا، مكتوب بلغة دلفي.أعتقد أنني وجدت الإجابة بناءً على إجابة كريس حول إعادة التوجيه:http://msdn.microsoft.com/en-gb/library/aa364418(VS.85).aspx

فهمتها:

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 

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

يحرر:شكرا لك لودفيج أيضا :-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top