FindNextFile 64-बिट विंडोज़ पर विफल रहता है?

सी ++ बिल्डर 2007 का उपयोग करके, FindFirstFile और FindNextFile फ़ंक्शन Vista और XP के 64-बिट संस्करणों पर कुछ फ़ाइलों को ढूंढने में सक्षम नहीं प्रतीत होते हैं। मेरा परीक्षण आवेदन 32-बिट है।

यदि मैं उन्हें फ़ोल्डर C: \ Windows \ System32 \ ड्राइवर्स के माध्यम से पुनरावृत्त करने के लिए उपयोग करता हूं तो उन्हें केवल कुछ हद तक फाइलें मिलती हैं हालांकि 185 हैं जब मैं कमांड प्रॉम्प्ट में dir कमांड जारी करता हूं। उसी उदाहरण कोड का उपयोग करने से सभी फ़ाइलों को एक्सपी के 32-बिट संस्करण पर ठीक किया जाता है।

यहां एक छोटा उदाहरण कार्यक्रम है:

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 \ 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.

एक ही सिस्टम पर एक डीआईआर कमांड यह देता है:

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

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 

विंडोज़ वास्तव में इस सामग्री की सूची देता है:

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

आपके इनपुट क्रिस के लिए धन्यवाद, जिसने मुझे यह जानने में मदद की कि क्या हो रहा है।

संपादित करें: लुडविग भी धन्यवाद :-)

0
जोड़ा

मैंने इसे एमएसडीएन पर पाया:

यदि आप किसी निर्देशिका में सभी फ़ाइलों को सूचीबद्ध करने के लिए 32-बिट एप्लिकेशन लिख रहे हैं और एप्लिकेशन 64-बिट कंप्यूटर पर चलाया जा सकता है, तो आपको FindFirstFile को कॉल करने से पहले Wow64DisableWow64FsRedirectionFunction को कॉल करना चाहिए और FindNextFile पर अंतिम कॉल के बाद Wow64RevertWow64FsRedirection को कॉल करना चाहिए । अधिक जानकारी के लिए, फ़ाइल सिस्टम रीडायरेक्टर देखें।

यहां लिंक है

मुझे इसके कारण अपना कोड अपडेट करना होगा :-)

0
जोड़ा

क्या आप वाकई डीआईआर कमांड के समान निर्देशिका में देख रहे हैं? ऐसा लगता है कि उनमें कोई भी फाइल सामान्य नहीं है।

इसके अलावा, यह मुद्दा नहीं है, लेकिन "सभी फाइलों" के लिए सही जंगली कार्ड है *

*। * का अर्थ है "कम से कम एक के साथ सभी फाइलें। नाम में"

0
जोड़ा

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

0
जोड़ा
मैं सी: \ विंडोज \ System32 \ ड्राइवर्स में फ़ाइलों को सूचीबद्ध करता हूं लेकिन वास्तव में सी: \ विंडोज \ SysWOW64 \ ड्राइवर्स में फ़ाइलों को प्राप्त करता है :-)
जोड़ा लेखक JubbaJubba, स्रोत
सी: \ विंडोज \ System64 \ ड्राइवर्स में फ़ाइलें क्या हैं?
जोड़ा लेखक Kris Kumler, स्रोत

जब आप संकलित करते हैं तो क्या कोई चेतावनी है?

क्या आपने इस विशेष परीक्षण के लिए ALL चेतावनियां चालू की हैं (क्योंकि यह काम नहीं कर रही है)?

चेतावनी को हल करने के लिए पहले सुनिश्चित करें।

0
जोड़ा