2012-08-05 9 views
15

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

मैं ब्लूटूथ के माध्यम से अपने लैपटॉप से ​​अपने एंड्रॉइड फोन पर एक फ़ाइल स्थानांतरित कर रहा था। मैंने फाइल एक्सप्लोरर में नई फाइल देखी, माना जाता है कि इसे पूरी तरह से स्थानांतरित कर दिया गया था, और इसलिए इसे /sdcard/bluetooth से /sdcard/torrents पर ले जाया गया। ऐसा करने के बाद, मैंने देखा कि वास्तव में इसे अभी भी स्थानांतरित किया जा रहा था। मेरे आश्चर्य के लिए, यह सफलतापूर्वक पूरा हुआ, फोन में एक अधिसूचना आइकन के साथ पुष्टि की, और दोनों तरफ मैन्युअल MD5 जांच द्वारा। अधिकांश प्रणालियों में, फ़ाइल चाल से दुर्घटना हो गई होगी।

इस सफल स्थानांतरण का कारण क्या है? मुझे पता है कि सामान्य रूप से, फ़ाइल पथ फ़ाइल सिस्टम पर फ़ाइल स्थान से अलग होता है (इस मामले में, एक एसडी कार्ड)। मुझे कल्पना है कि ब्लूटूथ ऐप ने फ़ाइल में एक हैंडल खोला है, और जब मैंने फ़ाइल को स्थानांतरित किया है, तो 'खुली फाइलों' की एक तालिका को नए पथ से अपडेट किया गया था। क्या यह सुविधा आम तौर पर किसी भी लिनक्स सिस्टम के बारे में सच है? क्या मैं एक फाइल पर mv लिख सकता हूं और कॉपी की उम्मीद कर सकता हूं - अपने नए स्थान में - सही होना?

+0

फ़ाइलों क्यों चलती हैं एक दुर्घटना के साथ शुरू करने के लिए कारण? फाइलें खुद बाइनरी डेटा के झुकाव हैं; फ़ाइल सिस्टम केवल यह दर्शाता है कि डेटा का क्लोज़ कैसे संग्रहीत, प्रतिनिधित्व और हटाया जाता है। – Makoto

+1

किसी फ़ाइल में स्वयं को स्थानांतरित करने से किसी दुर्घटना का कारण नहीं होने की उम्मीद की जा सकती है, लेकिन फ़ाइल पर 'mv' का उपयोग करके _whilst यह अभी भी लिखा जा रहा है _ संभवतः (क्योंकि सामान्य रूप से एक फ़ाइल जो फ़ाइल को लिखती है उसे यह मानने में सक्षम होना चाहिए फ़ाइल लिखने के लिए लिखने के लिए एक ही स्थान पर लिखती है-लिखने के लिए)। मैं समझने की कोशिश कर रहा हूं कि बाद वाला मामला सभी लिनक्स (या जावा, या एंड्रॉइड) सिस्टम के लिए सच है या नहीं। किसी भी व्यक्ति के लिए अतिरिक्त स्काउट/ब्राउनी पॉइंट जो यह समझा सकता है कि यह क्यों सफल हुआ! – halfer

उत्तर

31

जब आप एक ही फाइल सिस्टम के अंदर एक फ़ाइल ले जाते हैं, फ़ाइल स्वयं (inode) सब पर नहीं ले जाया गया है। परिवर्तन करने वाली एकमात्र चीज उस फाइल सिस्टम में निर्देशिका प्रविष्टियां हैं। (सिस्टम कॉल इस मामले में mv द्वारा लाया rename(2) है - अतिरिक्त जानकारी और प्रतिबंध के लिए उस पृष्ठ की जाँच करें।)

एक प्रक्रिया एक फाइल को खोलता है, फ़ाइल नाम ओएस को पारित कर दिया है इंगित करने के लिए जो फ़ाइल लिए है, लेकिन फ़ाइल डिस्क्रिप्टर जो आपको वापस मिलती है वह उस नाम से बिल्कुल जुड़ी नहीं है (आप इससे फ़ाइल नाम वापस नहीं प्राप्त कर सकते हैं) – यह इनोड से जुड़ा हुआ है।
जब आप एक फ़ाइल (उसी फाइल सिस्टम के अंदर) का नाम बदलते हैं तो इनोड अपरिवर्तित रहता है, इसलिए इसे खोलने वाली प्रक्रियाओं को खुशी से पढ़ना और लिखना – उनके लिए कुछ भी नहीं बदला गया है, उनकी फ़ाइल डिस्क्रिप्टर अभी भी मान्य है और दाईं ओर इशारा करता है डेटा।

यदि आप कोई फ़ाइल हटाते हैं तो वही बात। प्रक्रियाएं तब तक पढ़ना और लिखना जारी रख सकती हैं भले ही फ़ाइल किसी भी निर्देशिका प्रविष्टि के माध्यम से पहुंच योग्य न हो। (इससे भ्रमित परिस्थितियों का कारण बन सकता है जहां df रिपोर्ट करता है कि आपकी डिस्क भर चुकी है, लेकिन du कहता है कि आप df रिपोर्टों की बहुत कम जगह का उपयोग कर रहे हैं। हटाई गई फ़ाइलों को असाइन किए गए ब्लॉक अभी भी खुले नहीं होंगे जब तक कि उन प्रक्रियाओं को बंद न किया जाए फाइल डिस्क्रिप्टर।)

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

Unix & Linux पर कुछ पदों जो आपको दिलचस्प लग सकता है: दो अलग-अलग फाइल सिस्टम के बीच

+0

ग्रेट उत्तर, धन्यवाद मैट। हाँ, मैं फ़ाइल को एक फाइल सिस्टम के अंदर ले जा रहा था। मैंने यूनिक्स जैसी प्रणालियों पर कुछ सालों तक विकसित किया है, लेकिन इससे पहले इस क्षमता का सामना नहीं किया; मुझे उम्मीद थी कि यह लेखक प्रक्रिया को परेशान करेगा। बहुत चालाक सामान! – halfer

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