2011-09-08 16 views
6

अस्वीकरण: मैं तुरंत स्वीकार करूंगा कि फाइल सिस्टम कैसे काम करता है, इस बारे में विवरण के बारे में मुझे अज्ञानता की उचित मात्रा है। मैं इतने लंबे समय तक एनटीएफएस का उपयोग कर रहा हूं कि मैंने जो व्यवहार देखा है, उसके साथ-साथ जो भी मैंने इंटरनेट पर डोरकिंग से सीखा है, उसके बारे में बता रहा हूं - हालांकि ...यह पता लगाना कि फ़ाइल.मोव को 'कॉपी -> डिलीट' की आवश्यकता होगी या फ़ाइल सिस्टम टेबल

मैं उम्मीद कर रहा था कि वहां है यह पता लगाने का एक तरीका है कि 'स्थान ए' से 'स्थान बी' तक फ़ाइल को स्थानांतरित करते समय, क्या ऑपरेशन को 'File.Copy -> File.Delete' के बराबर की आवश्यकता होगी या यदि यह वास्तविक फ़ाइल डेटा की प्रतिलिपि नहीं करेगा, लेकिन बस 'मास्टर फ़ाइल टेबल' या जैसे स्थान में स्थान अपडेट करें।

विभिन्न उद्देश्यों के लिए, मैं कभी-कभी बड़ी संख्या में बड़ी फ़ाइलों को स्थानांतरित करता हूं। मैं यूआई में प्रगति की रिपोर्ट करना चाहता हूं।

मुझे एहसास है कि जब मैं File.Move को कॉल करता हूं और एक डिस्क/विभाजन पर किसी स्थान से फ़ाइल को स्थानांतरित करता हूं, तो फ़ंक्शन को डिस्क/विभाजन के बीच प्रभावी रूप से फ़ाइल डेटा कॉपी करना होगा। जब यह इस स्थिति से मुकाबला करता है, तो मैं यह पता लगाने में सक्षम होना चाहता हूं कि ऐसा होगा इसलिए मैं कोड का उपयोग कर सकता हूं जिसे मैंने लिखा है जो फ़ाइल की प्रतिलिपि बनायेगा और विस्तृत प्रगति रिपोर्टिंग देगा क्योंकि बाइट्स को स्थानांतरित किया जाता है, इसलिए मैं अक्सर UI में प्रगति बार अपडेट कर सकता हूं।

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

.NET 4 (सी #) का उपयोग करना, क्या अन्य माध्यमों के माध्यम से पता लगाना संभव है कि फ़ाइल को कॉल करना है या नहीं। किसी भी 'कॉपी -> डिलीट' ऑपरेशन की आवश्यकता होगी या फ़ाइल तालिका को अपडेट नहीं करेगा और फ़ाइल डेटा कॉपी नहीं करेगा ?

संपादित करें:

मैं नीचे टिप्पणी में नोट के रूप में, मैं कैसे सोचा कि यह किया जा सकता है पता लगाने के लिए हो सकता है अगर किसी दिए गए स्रोत फ़ाइल स्थान और गंतव्य फ़ाइल स्थान एक ही भौतिक पर स्थित हैं पर संभावनाओं डिस्क & विभाजन, और यदि ऐसा है, तो इसका मतलब यह होगा कि मैं सटीक रूप से व्यवहार की उम्मीद कर सकता हूं और यह तय कर सकता हूं कि कौन से फ़ंक्शंस कॉल करना है - फ़ाइल में बनाया गया है। 'तत्काल तत्काल' अद्यतन फ़ाइल सिस्टम तालिका के लिए मेव फ़ंक्शन जो मुझे लगता है कि उसी डिस्क पर जाने पर मुझे लगता है/भाग, या मेरी अधिक विस्तृत 'रिपोर्ट प्रगति हर' एक्स 'बाइट कॉपी' कस्टम फ़ाइल कॉपी कोड। फाइल ट्रांसफर की गति उन मशीनों पर काफी भिन्न हो सकती है जो मेरे कार्यक्रम चलेंगे, इसलिए जब भी संभव हो, मैं विस्तृत प्रगति/वर्तमान स्थानांतरण गति की रिपोर्ट करने में सक्षम होना चाहता हूं।

नोट - प्रोग्राम नेटवर्क यूएनसी पथ का उपयोग कर सकता है जो एक ही रूट पथ के साथ विभिन्न भौतिक डिस्क का उपयोग कर सकता है यानी: \\ somename \ share \ workfolder \ project एक अलग भौतिक डिस्क पर हो सकता है \\ somename \ शेयर \ workfoldder \ otherproject। तो मुझे एक ही डिस्क/विभाजन पर एक स्रोत और गंतव्य फ़ोल्डर देखने के लिए विभाजन आईडी या भौतिक डिस्क आईडी का पता लगाने के लिए एक विधि की आवश्यकता होगी।

धन्यवाद

+0

आपके पास यह पूछने का एक कारण है, मैं देखता हूं, लेकिन मुझे कोई तरीका नहीं है कि फाइल सिस्टम आपको इस प्रक्रिया पर किए गए अंतिम निर्णय के बारे में सूचित करने जा रहा है। यदि आप शैलफाइल कॉपी ऐपिस विंडोज का उपयोग कर सकते हैं तो प्रतिलिपि या चाल के दौरान दिखाए गए छोटे अच्छे संवाद में आपके लिए प्रगति पट्टी पहले से ही संभालती है। –

+2

मैं सोच रहा था कि यह पता लगाने का कोई तरीका हो सकता है कि किसी दिए गए स्रोत फ़ाइल स्थान और गंतव्य फ़ाइल स्थान एक ही भौतिक डिस्क और विभाजन पर स्थित हैं, और यदि ऐसा है, तो इसका मतलब यह होगा कि मैं व्यवहार की सटीकता से अनुमान लगा सकता हूं। एमएसडीएन पर यह कैसे आसानी से नहीं मिल सका। इसके अतिरिक्त, मैं उम्मीद कर रहा था कि लोग मुझे सावधानी बरतें कि अगर मेरी टिप्पणी में दृष्टिकोण सभी फाइल सिस्टम के लिए काम नहीं कर सकता है, तो मैं तदनुसार कोड कर सकता हूं। ShellFileCopy API का उपयोग करने के बारे में आपके सुझाव के लिए धन्यवाद।मैं इसे देख लूंगा लेकिन यदि संभव हो तो मैं अपनी पुस्तकालय का उपयोग करूंगा। – JHubbard80

+0

ठीक है, इसका जवाब पाने का यह एक आसान तरीका है, सिर्फ तकनीकी प्रमाण नहीं। स्पीड। जब एक फ़ाइल की प्रतिलिपि बनाई जाती है, तो सभी बाइट्स को वास्तव में एक फ़ाइल ले जाने के दौरान लिखा जाना चाहिए, बस फ़ाइल के शीर्षलेखों को फिर से लिखना होगा। इसके लिए 1 जीबी फ़ाइल को 5 गुना करने की कोशिश करने के लिए, और अगर यह तुरंत किया जाता है, तो यह चल रहा है, अगर उम्र लगती है, तो यह कॉपी -> हटाएं। निजी तौर पर, मुझे लगता है कि 'System.IO.File.Move()' फ़ाइल को ले जाता है, क्योंकि यह बेवकूफ होगा अगर वे प्रतिलिपि करेंगे -> प्रदर्शन के लिए हटाएं। – Aidiakapi

उत्तर

2

आप हमेशा 0/MoveFileWithProgress पर पी/आमंत्रित कर सकते हैं। एक सरसरी पढ़ने से, ऐसा लगता है कि स्थानांतरित होने के बजाए फ़ाइल कॉपी होने पर यह आपको अधिक बारीकी से प्रगति देगा।

वैकल्पिक रूप से, हमेशा SHFileOperation है, जो आपको विंडोज एक्सप्लोरर यूआई और सेमेन्टिक्स देगा।

+0

मैं दूसरे सुझाव का उपयोग करने में सक्षम नहीं हूं क्योंकि मैं वास्तव में उपयोग करना पसंद करूंगा एक कस्टम यूआई। मैं दोनों सुझावों की जांच करूंगा! धन्यवाद – JHubbard80

1

मुझे नहीं लगता कि आप के रूप में आप देखभाल करने के लिए नहीं करना पड़ेगा एक सामान्य तरीके से ऐसी बात का पता लगा सकते हैं। यदि आप इसका परीक्षण कर सकते हैं, तो क्या होगा और अन्यथा यह होगा कि इस से कोई ज्ञान निकाला जा सकता है (स्थानांतरण की गति को छोड़कर)।

.net में फ़ाइल सिस्टम को सारणीबद्ध किया गया है ताकि आप फ़ाइलों को एक स्थान से दूसरे स्थान पर ले जा सकें, यह जानने के बिना कि आप किस विभाजन/फाइल सिस्टम/नेटवर्क ड्राइव से प्रतिलिपि बना रहे हैं।

अपनी विशिष्ट समस्या के लिए, आप हमेशा प्रगति पट्टी क्यों नहीं दिखाते हैं और इसे दोनों मामलों के लिए एक निश्चित अंतराल पर अद्यतन किया है।

+0

मैं सोच रहा था कि किसी दिए गए स्रोत फ़ाइल स्थान और गंतव्य फ़ाइल स्थान एक ही भौतिक डिस्क और विभाजन पर स्थित हैं, और यदि ऐसा है, तो इसका मतलब यह होगा कि मैं अपने पोस्ट में वर्णित व्यवहारों का सटीक अनुमान लगा सकता हूं। मैं आईओ लोड के आधार पर ऐसा करने की इच्छा करता हूं, फाइल ट्रांसफर की गति उन प्रणालियों पर बहुत अधिक उतार-चढ़ाव करती है जिनके लिए मैं प्रोग्राम लिखता हूं - इसलिए मैं उपयोगकर्ताओं को सटीक प्रगति संकेतक देना पसंद करता हूं ताकि वे सटीक% पूर्ण देख सकें और स्थानांतरण की गति में मतभेद देख सकें । – JHubbard80

0

जबकि 100% सही नहीं है (सिम-लिंक इसे चीजों की तरह दिखते हैं, वे एक बड़े विभाजन होते हैं जबकि वे अलग-अलग भौतिक ड्राइव हो सकते हैं (मेरे सिर के शीर्ष से डब्ल्यूएचएस व्यापक रूप से उपयोग करता है), मैं प्रगति के उद्देश्य के लिए कहूंगा बार यह मानते हुए कि एक ही विभाजन (System.IO.Path.GetPathRoot) पर रहना संभवतः पर्याप्त होगा।

0

मुझे हस्तांतरण की गति और प्रगति सलाखों की निगरानी के बारे में कुछ भी पता नहीं है लेकिन यह पता लगाने के मुद्दे के लिए कि कोई फ़ाइल है या नहीं एक अलग ड्राइव/विभाजन में जाने के लिए आप बस गंतव्य और स्रोत फ़ाइल के ड्राइव/विभाजन पत्र की तुलना कर सकते हैं ...

यदि आप File.Move के लिए पूर्ण पथ का उपयोग कर रहे हैं तो आप कुछ सरल के रूप में उपयोग कर सकते हैं :

if(sourcePath[0]!=destinationPath[0]) 
    //enable transfer speed monitoring 

यदि आप संबंधित पथ आप एक छोटे से अधिक स्ट्रिंग पथ की व्याख्या के साथ गंतव्य/स्रोत ड्राइव/विभाजन को निकालने के लिए की जरूरत का उपयोग कर रहे हैं।

मुझे खेद है कि मेरा समाधान बहुत आसान है या यदि मुझे कोई अन्य समस्या नहीं दिखाई दे रही है।

+0

प्रोग्राम नेटवर्क यूएनसी पथ का उपयोग कर सकता है जो विभिन्न भौतिक डिस्क का उपयोग कर सकता है लेकिन एक ही रूट पथ (और कोई ड्राइव अक्षर नहीं) यानी \\ somename \ share \ workfolder \ project को एक अलग भौतिक डिस्क पर मैप किया जा सकता है \\ SomeName \ शेयरों \ workfolder \ otherproject। मैं इसे विंडोज में देख सकता हूं, लेकिन इसे प्रोग्रामेटिक रूप से करने में सक्षम होने की आवश्यकता है (यदि यह समझा जाता है कि इस पर व्यवहार की प्रत्याशा के लिए भरोसा किया जा सकता है) – JHubbard80

1

मुझे पूरा यकीन है कि आप यह नहीं कर सकते हैं।

एनटीएफएस पर भी शुरुआत करने वालों के लिए स्थानीय ड्राइव के लिए ड्राइव लेटर को देखकर पर्याप्त नहीं है क्योंकि you can mount a drive inside an empty folder on an existing drive है। इसका मतलब है कि भले ही दोनों पथों में एक ही ड्राइव अक्षर हो, फिर भी वे अलग-अलग डिस्क पर आरोहित हो सकते हैं।

इसे एक और कदम लेने के लिए बाहरी शेयरों पर विचार करें, संभवतः एक * निक्स आधारित प्रणाली पर लगाए गए और सांबा के माध्यम से उजागर किए गए। * निक्स प्रतीकात्मक लिंक यह बताते हुए असंभव बनाते हैं कि दो पथ एक ही भौतिक डिवाइस पर अकेले पथ देखकर रहते हैं - एकमात्र विकल्प रिमोट मशीन से पूछताछ करना होगा "क्या ये दो पथ एक ही ड्राइव पर मौजूद हैं?", जो कुछ मुझे बहुत संदेह होगा।

मैं केवल File.Move का उपयोग करता हूं और स्वीकार करता हूं कि आपको प्रगति अपडेट नहीं मिलते हैं। अपनी खुद की प्रतिलिपि कार्यान्वयन लिखना मुझे किसी भी तरह से "विशेष रूप से अच्छा विचार नहीं" के रूप में हमला करता है।

+0

कोई अच्छा विचार नहीं है? मैं असहमत हूं - यह हमेशा बहुत अच्छी तरह से काम करता है और मुझे उन सभी प्रकार की चीजों को अनुकूलित करने की इजाजत देता है जो मैं समय के साथ करना चाहता था =] मैं मानता हूं, मैं एक नियंत्रण सनकी हूं। विभिन्न प्रकार के शेयरों में ऐसा करने की कठिनाइयों को छूने के लिए धन्यवाद। मैं अलग-अलग पथों के लिए मैन्युअल रूप से विंडोज़ में हार्ड डिस्क आईडी खींच सकता हूं। मैं अभी भी खोजूंगा कि इस जानकारी को प्रोग्रामेटिक रूप से कैसे फसल करें और यहां तक ​​कि अगर यह मुझे नहीं बताएगा कि यह एक ही विभाजन पर है, तो यह कुछ भी नहीं होगा। फिर से धन्यवाद - मैं यह सत्यापित करने की कोशिश करूंगा कि हमारे नेटवर्क शेयरों पर मैं कौन सी विशेष फाइल सिस्टम की उम्मीद कर सकता हूं। – JHubbard80

+0

@ JHubbard80 फ़ाइलों की प्रतिलिपि बनाना और स्थानांतरित करना आमतौर पर उपयोगकर्ता स्थान में नहीं किया जाता है, जो ऑपरेटिंग सिस्टम द्वारा सर्वोत्तम रूप से संभाला जाता है। – Justin

+0

मैंने एक आइटम को स्पष्ट नहीं किया - मैं अक्सर अन्य निर्मित विधियों को लपेट रहा हूं जिनके पास File.Copy आदि की तुलना में बेहतर रिपोर्टिंग विधियां हैं I मान लीजिए कि वे विधियां ओएस कॉल का उपयोग करती हैं - मैं लगभग बाइट्स के ब्लॉक को मैन्युअल रूप से कॉपी नहीं कर रहा हूं। यदि उपयोगकर्ता स्थान से आपका मतलब है 'प्रोग्रामर द्वारा', मैं सराहना करता हूं कि यह आमतौर पर मेरे द्वारा भी नहीं किया जाता है। हालांकि कभी-कभी मुझे एक लक्ष्य प्राप्त करने के लिए यह आवश्यक और काफी कार्यात्मक पाया गया है। आपकी प्रतिक्रिया के लिए आपका धन्यवाद। – JHubbard80

0

आप GetFileInformationByHandle() फ़ंक्शन को P/आमंत्रित कर सकते हैं, जो वॉल्यूम सीरियल नंबर देता है। यदि वॉल्यूम सीरियल नंबर दोनों फाइलों के लिए समान है, तो वे एक ही वॉल्यूम पर हैं और कोई कॉपी-एंड-डिलीट आवश्यक नहीं होगा।

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