2010-02-22 8 views
7

मेरे पास एक ऐसा प्रोग्राम है जो फ़ाइलों को दो फ़ोल्डरों में तुलना करता है। मैं यह जानना चाहता हूं कि फ़ाइल का नाम बदल दिया गया है, नवीनतम फ़ाइल (सबसे हाल ही में नामित) निर्धारित करें, और मिलान करने के लिए पुरानी फ़ाइल पर नाम अपडेट करें।मैं कैसे निर्धारित कर सकता हूं कि फ़ाइल का हाल ही में नाम कब बदला गया था?

इसे पूरा करने के लिए, मैं यह देखने के लिए जांचूंगा कि नवीनतम फ़ाइल पुरानी के समान है, और यदि यह है, तो बस नए फ़ाइल से मेल खाने के लिए पुरानी फ़ाइल का नाम बदलें।

समस्या यह है कि मेरे पास यह बताने के लिए कुछ भी नहीं है कि मुझे कौन सी फ़ाइल का हाल ही में नाम दिया गया था।

मुझे कुछ ऐसी संपत्ति पसंद आएगी जैसे FileInfo.LastModified, लेकिन जिन फ़ाइलों का नाम बदल दिया गया है।

मैंने पहले ही फाइलसिस्टम वाटर जैसे समाधानों को देखा है, और यह वास्तव में मैं नहीं देख रहा हूं। किसी भी फ़ोल्डर की स्थिति को ट्रैक करने वाली कुछ समर्पित प्रक्रियाओं के बारे में चिंता किए बिना, जब भी मैं चाहता हूं, मैं अपने सिंक्रनाइज़र को चलाने में सक्षम होना चाहता हूं।

कोई विचार?

उत्तर

1

एक: कम से कम NTFS पर, आप alternate data streams to a file संलग्न कर सकते हैं। अपनी पहली सिंक पर, आप उन्हें टैग करने के लिए स्रोत फ़ाइलों में ADS में एक GUID संलग्न कर सकते हैं।

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

+0

... और निश्चित रूप से, इसे 'LastModified' के साथ संयोजित करें। –

+0

मैं पहले से ही प्रत्येक छोर पर निर्देशिका के हैंश स्टोर करता हूं। डेटा बिट-बाय-बिट मिलान करना पहले से ही संभव है। मैं बस उम्मीद कर रहा था कि मैं पूर्व-मौजूदा फ़ाइलों को स्थानांतरित करके धीमी नेटवर्क पर समन्वयित करते समय कुछ बैंडविड्थ को सहेजने में सक्षम हो सकता हूं। ऐसा लगता है कि ऐसा करने के लिए कोई गैर-एनटीएफएस विशिष्ट तरीका नहीं है। –

+0

यह मैप किए गए ड्राइवरों (या नेटवर्क शेयर) पर काम कर सकता है साथ ही प्रदान किया गया है कि स्रोत वॉल्यूम एनटीएफएस है। यदि आपको पहले से यह नहीं मिला है, तो यह कुछ मदद की हो सकती है: http://www.codeproject.com/KB/cs/ntfsstreams.aspx –

0

आप संभवतः एक कॉन्फ़िगरेशन फ़ाइल बना सकते हैं जिसमें फ़ोल्डर के भीतर सभी अपेक्षित नामों की एक सूची हो, और फिर, यदि फ़ोल्डर में कोई फ़ाइल नामों की अपेक्षित सूची का सदस्य नहीं है, तो यह निर्धारित करें कि फ़ाइल तब हो चुकी है नाम दिया। हालांकि, यह काम की एक और परत जोड़ देगा, क्योंकि जब भी आप फ़ोल्डर में एक नई फाइल जोड़ना चाहते हैं तो आपको सूची बदलनी होगी।

+0

यह वास्तव में मेरे उपकरण के साथ काम नहीं करता है। यह दोनों दिशाओं में किसी भी दो निर्देशिका सिंक्रनाइज़ करने के लिए है। –

+0

क्या आपने तुलना से परे कोशिश की है? आप जो खोज रहे हैं उसके लिए यह एक अच्छा टूल है। – Aaron

0

फाइल सिस्टम आमतौर पर इसे ट्रैक नहीं करते हैं।

चूंकि आप विंडोज पर प्रतीत होते हैं, तो आप GetFileInformationByHandle() का उपयोग कर सकते हैं। (क्षमा करें, मुझे सी # समकक्ष नहीं पता है।) आप यह देखने के लिए लौटाए गए स्ट्रक्चर में "फ़ाइल इंडेक्स" फ़ील्ड्स का उपयोग कर सकते हैं कि फाइलों के समान इंडेक्स जैसा है जो आपने पहले देखा था। ध्यान रखें कि हार्डलिंक्स में भी वही अनुक्रमणिका होगी।

वैकल्पिक रूप से आप किसी भी तरह से हैश फ़ाइल सामग्री कर सकते हैं।

मुझे नहीं पता कि आप क्या करने की कोशिश कर रहे हैं, इसलिए मैं आपको नहीं बता सकता कि इनमें से कोई भी बिंदु समझ में आता है या नहीं। यह हो सकता है कि सबसे उचित जवाब है, "नहीं, आप ऐसा नहीं कर सकते।"

+0

मुझे यकीन है कि यह ओपी की तलाश में नहीं है, लेकिन यह एक दिलचस्प विचार है ... फिर भी ओपी की परीक्षण की योजना से बेहतर है यदि दो फाइलें एक नाम निर्धारित करने के लिए थोड़ा समान हैं। – rmeador

+0

यह एक अच्छा विचार है, लेकिन फ़ाइल आईडी के साथ बहुत सी समस्याएं हैं। टिप्पणियां अनुभाग कहता है, "पहचानकर्ता जो nFileIndexHigh और nFileIndexLow सदस्यों में संग्रहीत है उसे फ़ाइल आईडी कहा जाता है। [इसलिए उच्च अनुक्रमणिका और कम अनुक्रमणिका => ** फ़ाइल आईडी **] ** फ़ाइल आईडी ** के लिए समर्थन फ़ाइल है सिस्टम-विशिष्ट [इसलिए, सभी फाइल सिस्टम इसका समर्थन नहीं कर सकते हैं ... एनटीएफएस शायद करता है, जो जानता है कि बाकी क्या करते हैं?]। फ़ाइल आईडी समय के साथ अनूठी होने की गारंटी नहीं है, क्योंकि फाइल सिस्टम उन्हें पुन: उपयोग करने के लिए स्वतंत्र हैं [लेकिन इसके लिए समय के स्नैपशॉट वे होंगे, मुझे लगता है]। कुछ मामलों में, फ़ाइल के लिए फ़ाइल आईडी समय के साथ बदल सकती है। " – Alexandru

1

यदि आप एनटीएफएस ड्राइव पर चल रहे हैं तो आप change journal सक्षम कर सकते हैं, जिसे आप घटनाओं का नाम बदलने जैसी चीजों के लिए पूछ सकते हैं। हालांकि आपको इसे शुरू करने में सक्षम करने के लिए एक व्यवस्थापक होना चाहिए और यह डिस्क स्पेस का उपयोग करेगा। दुर्भाग्य से मुझे पत्रिका पढ़ने के किसी भी विशिष्ट सी # कार्यान्वयन के बारे में पता नहीं है।

0

मैं सीआरसी (उदाहरण के लिए CRC example) (सभी?) फाइलों को सीआरसी मूल्य, फ़ाइल नाम इत्यादि के साथ अंतिम अद्यतन समय संग्रहीत करने वाली 2 निर्देशिकाओं में फाइलें बनाउंगा। इसके बाद, सीआरसी द्वारा माच ढूंढने वाली सूचियों के माध्यम से बातचीत करें और फिर यह निर्धारित करने के लिए दिनांक मान का उपयोग करें कि क्या करना है।

+0

मैं पहले से ही ऐसा करता हूं। समस्या यह है कि फ़ाइल का नाम बदलने से किसी भी समय टिकटों को संशोधित नहीं किया जाता है। –

+0

ओह - जहां तक ​​मुझे पता है कि आप एक फ़ाइल का नाम बदल नहीं सकते हैं और इसका समय-टिकट संशोधित नहीं कर सकते हैं। यदि आप एक बहुत कम स्तर एपीआई कॉल (संभवतः सी # द्वारा खुलासा नहीं किया जा सकता है) –

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

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