2010-07-29 9 views
12

मुझे विंडोज एक्सप्लोरर जैसी फ़ाइलों के लिए कंप्यूटर खोजने का एक तरीका चाहिए। मैं चाहता हूं कि मेरा प्रोग्राम खोज करे, हार्ड ड्राइव सी कहें:। मुझे फ़ोल्डरों और फ़ाइलों के लिए सी: \ खोजने के लिए इसकी आवश्यकता है (केवल वे जिन्हें आप सी में देख सकते हैं: \ यदि उपयोगकर्ता फ़ोल्डर परीक्षण (सी: \ टेस्ट) जैसे सूची में फ़ाइल पर क्लिक करता है तो यह परीक्षण खोजेगा और चलो उपयोगकर्ता क्या फ़ाइलें/फ़ोल्डर उस में कर रहे हैंफ़ाइलों और फ़ोल्डर्स के लिए कंप्यूटर को कैसे खोजें

+0

में नामित किया जा सकता है और अपने प्रश्न है ... क्या? –

+0

यह एक मंच-विशिष्ट समस्या है। क्या आप विंडोज़, यूनिक्स इत्यादि पर हैं? – TreDubZedd

+2

यदि वह अपनी हार्ड ड्राइव को 'सी:' और निर्देशिकाओं के रूप में संदर्भित करता है तो यह स्पष्ट रूप से स्पष्ट है कि उसका प्लेटफ़ॉर्म क्या हो सकता है ... ;-) ओह, और बैकस्लैश पथ विभाजक प्रकार इसे दूर भी देता है। –

उत्तर

14

आप विंडोज उल्लेख के बाद से, सबसे सीधे आगे WinAPI जिस तरह से यह FindFirstFile और FindNextFile कार्यों के साथ है क्या करना है।

संपादित करें: यहाँ एक उदाहरण आप एक निर्देशिका में सभी फ़ाइलें/फ़ोल्डर की गणना करने के लिए कैसे पता चलता है कि है।

#include <Windows.h> 
#include <iostream> 


int main() 
{ 
    WIN32_FIND_DATA file; 
    HANDLE search_handle=FindFirstFile(L"C:\\*",&file); 
    if (search_handle) 
    { 
     do 
     { 
      std::wcout << file.cFileName << std::endl; 
     }while(FindNextFile(search_handle,&file)); 
     FindClose(search_handle); 

    } 

} 
+0

यह केवल फाइलें पाता है? मुझे फ़ोल्डर्स और फाइलों की आवश्यकता है। – blood

+0

नहीं, यह दोनों को पाता है। यह आपको फ़ाइलों/फ़ोल्डरों को खोजने के लिए एक खोज मानदंड भी देता है। – monoceres

+0

मैंने एक उदाहरण भी जोड़ा – monoceres

2

आप के साथ सी # या प्रबंधित सी ++ यह करने के लिए Directory वर्ग के सदस्यों उपयोग कर सकते हैं निम्नलिखित MSDN लेख:।।

http://support.microsoft.com/kb/307009

आप उपयोग करना चाहते हैं एमएफसी के साथ सी ++ आप CFileFind

http://msdn.microsoft.com/en-us/library/f33e1618%28v=VS.80%29.aspx

का उपयोग कर सकते हैं

आपको फ़ाइल सिस्टम पेड़ प्रस्तुत करने के लिए अपनी खुद की ब्राउज़ विंडो की आपूर्ति करनी होगी।

या आप दोनों के लिए काम करने के लिए निर्देशिका/फ़ाइल नियंत्रणों में से एक का उपयोग कर सकते हैं।

+0

वह .NET का उपयोग करता है और सी ++/सीएलआई का उपयोग करने की आवश्यकता है। –

+0

@ जॉर्ज: स्पष्टीकरण के लिए धन्यवाद। यदि वह .NET के बिना C++ का उपयोग करना चाहता है तो मैंने अतिरिक्त जानकारी जोड़ दी है। –

+0

: | मुझे जानकारी नहीं मिली – blood

4

यह ओएस निर्भर होगा। तो सवाल यह है

How can I get a list of files in a directory using C or C++?

अच्छी तरह से इस समस्या को संभालती है। आप यहां DIRENT डाउनलोड कर सकते हैं।

अब आपके पास यह है, मैं DFS/BFS एल्गोरिदम के साथ एक फ़ाइल की खोज करने की अनुशंसा करता हूं। आप मान सकते हैं कि संपूर्ण निर्देशिका संरचना tree है जहां प्रत्येक फ़ाइल एक पत्ता नोड है और प्रत्येक उपनिर्देशिका एक आंतरिक नोड है।

तो तुम सब करने की है, है

  1. जैसे एक समारोह के साथ एक निर्देशिका में फ़ाइलें/फ़ोल्डर की सूची प्राप्त करें:
    void getFilesFolders(vector<string> & dir_list, const string & folder_name)
  2. यदि यह एक निर्देशिका है, के साथ 1 के लिए जाना निर्देशिका का नाम
  3. यदि यह एक फ़ाइल है, तो यह समाप्त करें कि यह फ़ाइल है जिसे आप ढूंढ रहे हैं, अन्यथा अगली फ़ाइल पर जाएं।
+0

सी या सी ++ का उपयोग कर निर्देशिका में फ़ाइलों की सूची कैसे प्राप्त कर सकता हूं? अच्छा है लेकिन कोड मैं काम नहीं कर सकता। केवल ब्रायन आर बॉन्डी का कोड उसका आखिरी हिस्सा है, लेकिन यह केवल फाइलों को ढूंढता है जो मैं चाहता था और मुझे यह भी नहीं पता कि यह कैसे काम करता है, इसलिए मैं इसे अपने प्रोग्राम के लिए संपादित नहीं कर सकता :( – blood

+0

सख्त से खेलना देखें कि यह काम करता है कि – blood

+0

पर मैं आपको सख्त नहीं कर सकता हूं, लेकिन मैं इसे 9 .9 फाइल के रूप में अनजिप करता हूं और सब कुछ। क्या मुझे कुछ याद आया क्योंकि मैंने इसे अभी आपके लिंक से डाउनलोड किया है – blood

2

बढ़ावा :: फाइल सिस्टम उस के लिए एक क्रॉस-प्लेटफ़ॉर्म समाधान हो सकता है (इसमें ऐसे कार्यों के लिए जांचें)।

+2

मैं वास्तव में तीसरे पक्ष के सॉफ्टवेयर नहीं चाहता था – blood

+1

वास्तव में तीसरे पक्ष के सॉफ्टवेयर इतने ज्यादा नहीं, बूस्ट को सी ++ प्रोग्रामर द्वारा मानक माना जाता है, लेकिन तब आप ऐसा नहीं मानते हैं जो मानक पुस्तकालयों का उपयोग करना पसंद करता है (iostream के अलावा, C++ में से एक कम महान विशेषताएं)। – CashCow

2
#include <Windows.h> 
#include <iostream> 


int FindF(char* pDirectory) 
{ 
    char szFindPath[MAX_PATH] = {0}; 
    strcpy(szFindPath, pDirectory); 
    strcat(szFindPath, "\\*"); 
    WIN32_FIND_DATA file; 
    HANDLE search_handle=FindFirstFile(szFindPath,&file); 
    if (search_handle) 
    { 
     do 
     { 
      if(file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) 
      { 
       strcpy(szFindPath, pDirectory); 
       strcat(szFindPath, "\\"); 
       strcat(szFindPath, file.cFileName); 
       FindF(szFindPath); 
      } 
      std::wcout << file.cFileName << std::endl; 
     }while(FindNextFile(search_handle,&file)); 
     CloseHandle(search_handle); 

    } 

} 
+0

यह लगभग एक अच्छा समाधान है: 1. यह ज्यादातर सी में है, फिर भी आप आईस्ट्रीम में डालते हैं ताकि आप सी में आईस्ट्रीम के साथ लिख रहे हों ... यदि आप सी ++ में लिखना चाहते हैं तो मैं कम से कम std :: स्ट्रिंग का उपयोग करूंगा। आपका असली गंभीर गलती है कि आप "डॉट्स" की जांच नहीं करते हैं, इसलिए आपका हमेशा के लिए भर्ती करेगा (या अधिक संभावना है कि इस साइट के नाम से पीड़ित)। – CashCow

+0

FindFirstFile() के साथ खोले गए हैंडल को बंद करने के लिए FindClose() का उपयोग करें। CloseHandle() डीबग मोड में "अमान्य हैंडल" फेंक देगा। – NoAngel

1

इसे पूरा करने के लिए वास्तव में तृतीय पक्ष लाइब्रेरी का उपयोग करने की आवश्यकता नहीं है। यह एक छोटा, स्वतंत्र फ़ंक्शन है जो उप-निर्देशिकाओं की फ़ाइलों सहित निर्देशिका में सभी फ़ाइलों (उनके पथों के साथ) सूचीबद्ध करता है। std::string folderName को \ के साथ समाप्त करना होगा, और यदि आप कंप्यूटर पर सभी फाइलों को सूचीबद्ध करना चाहते हैं, तो बस GetLogicalDriveStrings के साथ फ़ंक्शन कॉलिंग में लूप बनाएं (यह \ के साथ स्ट्रिंग देता है, इसलिए यह इस मामले में अधिक सुविधाजनक नहीं हो सकता है)।

void FindAllFiles(std::string folderName) 
{ 
    WIN32_FIND_DATA FileData; 
    std::string folderNameWithSt = folderName + "*"; 
    HANDLE FirstFile = FindFirstFile(folderNameWithSt.c_str(), &FileData); 

    if (FirstFile != INVALID_HANDLE_VALUE) { 
     do { 
      if (strcmp(FileData.cFileName, ".") != 0 && strcmp(FileData.cFileName, "..") != 0) 
      { 
       if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
       { 
        std::string NewPath = folderName + FileData.cFileName; 
        NewPath = NewPath + "\\"; 

        FindAllFiles(NewPath); 
       } 
       else 
       { 
        std::cout /*<< folderName*/ << FileData.cFileName << std::endl; 
       } 
      } 
     } while(FindNextFile(FirstFile, &FileData)); 
    } 
} 

यह ASCII संस्करण, याद है कि फ़ाइलों और फ़ोल्डरों यूनिकोड

+1

मैं बस सोच रहा हूं, क्या आप समझा सकते हैं कि FindFile की तुलना में लाभ क्या हैं, कृपया? (और बीटीडब्ल्यू, एएससीआईआई एएसएसआई नहीं होना चाहिए?) –

संबंधित मुद्दे

 संबंधित मुद्दे