अंतर क्या हैं, और किस मामले में एक या दूसरे किसी भी तरीके से बेहतर साबित होंगे?विंडोज़ में, क्या मुझे CreateFile या fopen, पोर्टेबिलिटी को अलग करना चाहिए?
उत्तर
सभी कार्य fopen
पहले ही फाइलों के साथ सरल पोर्टेबल कार्यों के लिए इस्तेमाल किया जा सकता।
CreateFile
दूसरी तरफ न केवल फाइलों के साथ संचालन के लिए, बल्कि निर्देशिकाओं (संबंधित विकल्पों के उपयोग के साथ), पाइप और विभिन्न विंडोज उपकरणों के साथ भी उपयोग किया जा सकता है।
CreateFile
FILE_FLAG_NO_BUFFERING
, FILE_ATTRIBUTE_TEMPORARY
और FILE_FLAG_SEQUENTIAL_SCAN
है, जो विभिन्न परिदृश्यों में बहुत उपयोगी हो सकता है की तरह अतिरिक्त उपयोगी स्विच का एक बहुत, है।
आप CreateFile
का उपयोग फ़ाइल नाम के साथ MAX_PATH
वर्णों के साथ कर सकते हैं। यह कुछ सर्वर अनुप्रयोगों या उन लोगों के लिए महत्वपूर्ण हो सकता है जो किसी भी फ़ाइल (एक वायरस स्कैनर या उदाहरण के लिए बैकअप एप्लिकेशन) खोलने में सक्षम होना चाहिए। यह नेमस्पेस अर्थशास्त्र का उपयोग करके सक्षम है, हालांकि इस मोड की अपनी चिंताएं हैं, जैसे वास्तव में ".."
या L"\xfeff\x20\xd9ab"
नामक फ़ाइल बनाने की क्षमता (बाद में उन्हें हटाने की कोशिश कर रहे शुभकामनाएं)।
आप विभिन्न सुरक्षा स्थितियों में CreateFile
उपयोग कर सकते हैं। मेरा मतलब न केवल सुरक्षा विशेषताओं का उपयोग है। मौजूदा प्रक्रिया SE_BACKUP_NAME या SE_RESTORE_NAME विशेषाधिकार है (व्यवस्थापक की तरह आम तौर पर है) और इस विशेषाधिकार सक्षम करते हैं, एक CreateFile
का उपयोग किसी भी फाइल भी एक फाइल करने के लिए जो आप सुरक्षा डिस्क्रिप्टर के माध्यम से कोई उपयोग कर सकते है खोलने के लिए कर सकते हैं।
यदि आप केवल एक फ़ाइल की सामग्री को पढ़ना चाहते हैं, तो आप फ़ाइल मैपिंग बनाने के लिए CreateFile
, CreateFileMapping
और MapViewOfFile
का उपयोग कर सकते हैं। फिर आप स्मृति के ब्लॉक के साथ फ़ाइल के साथ काम कर सकते हैं, जो संभवतः आपके एप्लिकेशन की गति को बढ़ा सकता है।
भी समारोह के अन्य उपयोगों, जो the corresponding MSDN article.
में विस्तार से वर्णन किया गया है तो मैं संक्षेप में प्रस्तुत कर सकते हैं: केवल यदि आप एक कठिन पोर्टेबिलिटी आवश्यकताओं है या आप कुछ बाहरी पुस्तकालय के लिए एक FILE*
पारित करने के लिए जरूरत है, तो आपको fopen
का उपयोग करना होगा। अन्य सभी मामलों में मैं आपको CreateFile
का उपयोग करने की सलाह दूंगा। सर्वोत्तम परिणामों के लिए, मैं विशेष रूप से विंडोज एपीआई सीखने की भी सलाह दूंगा, क्योंकि ऐसी कई विशेषताएं हैं जिनके लिए आप एक अच्छा उपयोग कर सकते हैं।
UPDATED: नहीं सीधे आपके प्रश्न से संबंधित है, लेकिन मैं भी transactional I/O कार्य करता है जो Windows Vista के साथ शुरू करने का समर्थन कर रहे पर एक नज़र लेने के लिए सलाह देते हैं। इस सुविधा का उपयोग करके, आप फ़ाइलों, निर्देशिकाओं या रजिस्ट्री के साथ एक लेनदेन के रूप में ऑपरेशन का एक गुच्छा कर सकते हैं जिसे बाधित नहीं किया जा सकता है। यह एक बहुत शक्तिशाली और दिलचस्प उपकरण है। यदि आप अब लेनदेन I/O फ़ंक्शंस का उपयोग करने के लिए तैयार नहीं हैं, तो आप CreateFile
से शुरू कर सकते हैं और बाद में अपने आवेदन को लेनदेन I/O पर पोर्ट कर सकते हैं।
यह वास्तव में आप लिख रहे हैं कार्यक्रम किस प्रकार पर निर्भर करता है। यदि यह पोर्टेबल माना जाता है, तो fopen
आपके जीवन को आसान बना देगा। fopen
"दृश्यों के पीछे" CreateFile
पर कॉल करेगा।
कुछ और उन्नत विकल्प (कैश नियंत्रण, फ़ाइल एक्सेस कंट्रोल इत्यादि) केवल तभी उपलब्ध हैं जब आप Win32 API का उपयोग कर रहे हैं (वे Win32 फ़ाइल हैंडल पर निर्भर करते हैं, FILE
स्टडीओ में पॉइंटर के विपरीत), इसलिए यदि आप एक शुद्ध Win32 अनुप्रयोग लिख रहे हैं, आप CreateFile का उपयोग करना चाह सकते हैं।
CreateFile आप
- अतुल्यकालिक मैं के लिए ओपन फाइल/ओ की सुविधा देता है FILE_FLAG_SEQUENTIAL_SCAN तरह
- दर्रा अनुकूलन संकेत
- सेट सुरक्षा और सूत्रण मुद्दों के बिना सेटिंग इनहेरिट
वे नहीं लौटते फॉपेन/फ़ाइल ऑब्जेक्ट के साथ एक ही हैंडल प्रकार, आप अन्य रनटाइम फ़ंक्शन जैसे कि फ़ूट्स (साथ ही इसे "मूल" फ़ाइल हैंडल में परिवर्तित कर सकते हैं)
जब भी संभव हो, ऑब्जेक्ट उन्मुख रैपर पसंद करते हैं जो RAII का समर्थन करते हैं, जैसे fstream या boost फ़ाइल IO ऑब्जेक्ट्स।
आपको निश्चित रूप से शेयर मोड की परवाह करना चाहिए, इसलिए fopen() और एसटीएल अपर्याप्त हैं।