2010-09-04 11 views
7

मुझे ऐसी प्रक्रिया की आवश्यकता है जो जांचता है कि किसी दिए गए फ़ोल्डर में नए फ़ोल्डर्स/फ़ाइलों को जोड़ा गया था या नहीं। मुझे एप्लिकेशन शुरू होने पर चलाने के लिए इस प्रक्रिया की आवश्यकता है ताकि इस चरण में प्रसंस्करण का समय महत्वपूर्ण हो।मैं कैसे जांच सकता हूं कि फ़ोल्डर की सामग्री बदल दी गई है

मुझे लगता है कि मैं वर्तमान स्थिति का लॉग, पिछले राज्य का लॉग, सॉर्ट कर सकता हूं और उनकी तुलना कर सकता हूं।

  1. सबसे पहले मुझे यह जानने की ज़रूरत है कि कोई और तरीका है या नहीं।

  2. दूसरा यदि कोई अन्य तरीका नहीं है तो फाइल पथों की दो सूचियों के बीच अंतर खोजने का सबसे अच्छा तरीका क्या है: संरचना और एल्गोरिदम दोनों।

पुरानी स्थिति:

c:\firstfolder\a.doc 
c:\firstfolder\b.doc 
c:\firstfolder\secondFolder\a.doc 
c:\firstfolder\secondFolder\b.doc 

नए राज्य:

c:\firstfolder\a.doc 
c:\firstfolder\b.doc 
c:\firstfolder\secondFolder\a.doc 
c:\firstfolder\secondFolder\b.doc 
c:\firstfolder\secondFolder\c.doc 

मैं c:\firstfolder\secondFolder\c.doc की तलाश में हूँ।

+0

आप को पता है की जरूरत है * * इसमें कोई परिवर्तन अर्थात एक 'boolean' परिणाम, या था, क्या क्या परिवर्तन किया गया है, यानी एक' सूची '? =) – Rob

+0

सूची की आवश्यकता है ... मैं इसे पिछले और सही स्थिति के लिए एक XML फ़ाइल बनाने और इसे "छोड़कर" का उपयोग करके तुलना करके तुलना करने में कामयाब रहा क्योंकि टिमवी को परेशान किया गया: http://stackoverflow.com/प्रश्न/3647958/खोज-द-डेल्टा-बीच-दो-xelements- उपयोग-छोड़कर-सी ...यह काम करता है लेकिन यह धीमा है – Asaf

उत्तर

1

चूंकि आपका एप्लिकेशन लगातार चल रहा नहीं है, इसलिए FileSystemWatcher का उपयोग करके आपके लिए एक अच्छा विकल्प नहीं लगता है, लेकिन मैं इसका उल्लेख करना चाहता था क्योंकि इससे आपकी तरफ से कुछ विचार हो सकते हैं।

आप पुराने राज्य की एक सूची है और आप here उल्लिखित दो सूचियों की तुलना करने के अतिरिक्त और विलोपन का निर्धारण करने के बाद से पहली सूची बनाया गया था एक की तरह एक एल्गोरिथ्म का उपयोग कर सकते नए राज्य की एक सूची बनाते हैं। प्रदान किए गए लिंक के स्वीकृत उत्तर में भी एक अच्छा समाधान है जो सूचियों को सॉर्ट नहीं किया गया है, जो बहुत अच्छी तरह से काम करता है।

+0

हैशसेट्स आशाजनक लग रहा है लेकिन मुझे उनके बारे में कुछ भी पता नहीं है ... उनके बारे में अधिक जानने की कोशिश करेंगे। धन्यवाद – Asaf

3

आप FileSystemWatcher कक्षा का उपयोग कर सकते हैं, मुझे लगता है कि यह ठीक है जो आप कर रहे हैं।

+3

यह केवल तब काम करता है जब एप्लिकेशन चल रहा है। यह कार्यक्रम के आक्रमण के बीच होने वाले परिवर्तनों का पता नहीं लगाएगा। – ChrisF

+1

+1 @ साइबरड्यूड: धन्यवाद, यह जानना अच्छा है कि यह श्रोता मौजूद है, (अगर मुझे यह भी चाहिए तो मुझे आश्चर्य हुआ) क्योंकि क्रिसफ ने कहा कि यह रनटाइम के दौरान केवल बदलावों को पकड़ता है, और मुझे पता होना चाहिए कि इसमें क्या बदलाव आया है आवेदन के पिछले भाग – Asaf

0

मुझे लगता है कि सबसे अच्छी शर्त निर्देशिका के माध्यम से रिकर्सिंग और राज्य को सहेज रही है। कुछ इस तरह:

public List<FileData> RecurseDirectory(string directory, int level, out int files, out int folders) 
     { 
      IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); 
      //long size = 0; 
      files = 0; 
      folders = 0; 
      WIN32_FIND_DATA findData; 
      List<FileData> list = new List<FileData>(); 

      IntPtr findHandle; 

      // add global escape chars if not present. 
      if (directory.StartsWith(@"\\?\")) 
      { 
       findHandle = FindFirstFile(directory + @"\*", out findData); 
      } 
      else 
      { 
       findHandle = FindFirstFile(@"\\?\" + directory + @"\*", out findData); 
      } 


      if (findHandle != INVALID_HANDLE_VALUE) 
      { 
       //if file exists: 


       do 
       { 
        if ((findData.dwFileAttributes & FileAttributes.Directory) != 0) 
        { 
         //if it's a directory: 

         if (findData.cFileName != "." && findData.cFileName != "..") 
         { 
          //increment folder counter. 
          folders++; 

          int subfiles, subfolders; 
          string subdirectory = directory + (directory.EndsWith(@"\") ? "" : @"\") + 
           findData.cFileName; 
          //Console.WriteLine("Dir:" + subdirectory); 

          //add it to list 
          String path = subdirectory; 
          FileData tempFileData = new FileData(); 
          tempFileData.path = path; 
          tempFileData.fileProperties = findData; 
          list.Add(tempFileData); 

          //allows -1 to do complete search. 
          if (level != 0) 
          { 
           //recurse through to next subfolder 
           list.AddRange(RecurseDirectory(subdirectory, level - 1, out subfiles, out subfolders)); 

           folders += subfolders; 
           files += subfiles; 
          } 
         } 
        } 
        else 
        { 
         // File 
         files++; 
         string subfile = directory + (directory.EndsWith(@"\") ? "" : @"\") + 
           findData.cFileName; 
         //Console.WriteLine("File:" + subfile); 
         //list.Add("File:" + subfile); 
         String path = subfile; 
         FileData t = new FileData(); 
         t.path = path; 
         t.fileProperties = findData; 
         list.Add(t); 

         //size += (long)findData.nFileSizeLow + (long)findData.nFileSizeHigh * 4294967296L; 
        } 
       } 
       while (FindNextFile(findHandle, out findData)); 
       FindClose(findHandle); 

      } 

      return list; 
     } 

इसके बाद, आपके पास राज्य की सूची होगी। यदि आपके पास सूची में पुराना राज्य भी है। अब सूचियों की तुलना करें।

+0

सभी रिकर्सन, Directory.GetDirectories और फ्रेमवर्क 4.0 निर्देशिका में कोई आवश्यकता नहीं है। अनन्य निर्देशिकाएं एक ही कॉल में पूरे पेड़ को पार कर सकती हैं। उल्लेख नहीं है कि उपरोक्त कोड को अतिरिक्त पी/आमंत्रण घोषणाओं की भी आवश्यकता होगी, जो दिखाए नहीं गए हैं। –

0

आप अंतिम स्थिति की समय जानकारी बचा सकते हैं। फिर आप इसके साथ फाइलों और फ़ोल्डर्स के निर्माण के समय की तुलना कर सकते हैं। निम्नलिखित कोड आपको एक विचार दे सकता है:

foreach(FileInfo f in dir.GetFiles() { 
    if(f.CreationTime > dtLastState) { 
     //do some interesting stuff 
    } 
} 

संपादित करें: यह एक पूर्ण उत्तर नहीं है। आप इस कोड से हटाए गए फाइल नहीं प्राप्त कर सकते हैं।

2

मुझे लगता है कि सिंक फ्रेमवर्क जो आप खोज रहे हैं वह हो सकता है।

http://msdn.microsoft.com/en-us/sync/default.aspx

+0

मुझे दो फ़ोल्डरों की तुलना करने की आवश्यकता है जिनमें समान उप फ़ोल्डर्स हैं लेकिन फ़ाइलें केवल नाम से बराबर हैं ... वे अलग-अलग बनाई गई हैं ताकि उनकी सामग्री, आकार और अन्य पैरामीटर स्रोत फ़ोल्डर के बराबर न हों। यही कारण है कि मुझे नहीं लगता कि आपका समाधान इस समय मेरे लिए काम करेगा। धन्यवाद असफ – Asaf

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