2016-02-25 4 views
8

ऐसा लगता है कि OpenOptions इस परिदृश्य का समर्थन नहीं करता है और एक मौजूदा फ़ाइल को या तो छोटा या ओवरराइट किया जाएगा।क्या फ़ाइल मौजूद और खोलने का कोई तरीका है यदि यह अस्तित्व में नहीं है लेकिन अन्यथा विफल रहता है?

उत्तर

5

जंग 1.9.0 के रूप में, OpenOptions::create_new है जो आपको सुरक्षित रूप से और परमाणु रूप से सुनिश्चित करता है कि आप एक नई फ़ाइल बना रहे हैं, और आपका आदेश अन्यथा विफल हो जाएगा।

2

अद्यतन: जैसा कि मैथ्यू डेविड ने टिप्पणियों में बताया। exists() std::path::Path से यह देखने के लिए उपयोग किया जा सकता है कि कोई पथ मौजूद है या नहीं।

ओल्ड उत्तर:

! access(filename, F_OK) 

access रिटर्न 0 यदि फ़ाइल मौजूद है, बशर्ते कि आपके पास:

सी में, एक फ़ाइल नाम/पथ आमतौर पर साथ किया जाता है मौजूद है, तो जाँच आवश्यक अनुमतियां

मैंने देशी जंग के बराबर एक त्वरित खोज की और कुछ भी नहीं मिला। इसलिए, इसके लिए आपको libc::access पर निर्भर रहने की आवश्यकता हो सकती है।

+6

क्या यहां दौड़ की स्थिति के लिए यह संभव है, जहां फ़ाइल 'पहुंच' के बाद अस्तित्व में आती है लेकिन 'ओपन' से पहले? – Shepmaster

+0

@ शेमपस्टर हां। और मेरा मानना ​​है कि मैंने इस बारे में कवरिटी स्कैन चेतावनी देखी है। लेकिन विकल्प क्या है? –

+0

आपको एक असुरक्षित फ़ंक्शन का उपयोग करने की आवश्यकता क्यों होगी? आप जांच सकते हैं कि कोई पथ मौजूद है ['मौजूद()'] (https://doc.rust-lang.org/std/path/struct.Path.html#method.exists) और फिर फ़ाइल को बनाते समय बनाएं 'टी। –

4

यह सी 11 में संभव है, या निम्न स्तर के ओएस एपीआई कार्यों का उपयोग करके सीधे संभव है।

यदि आप C11 का उपयोग करते हैं, तो fopen आपको फ़ाइल को "wx" मोड में खोलने की अनुमति देता है।

अन्यथा, लिनक्स पर, O_CREAT और O_EXCLopen(3) फ़ंक्शन दोनों को पास करना चाहिए। या, विंडोज़ पर dwCreationDispositionCreateFile() फ़ंक्शन के पैरामीटर को पास करें।


संपादित करें: मैं मूल रूप से तथ्य यह है कि open समारोह सी 11 में अद्यतन किया गया था याद किया।

+0

विशेष रूप से सी 11 में एक्सक्लूसिव ओपन मोड जोड़ा गया था। 'fopen (" wx ")' – bluss

+0

@bluss: Damned, मेरा पसंदीदा संदर्भ (http://en.cppreference.com/w/cpp/io/c/fopen) इस 'x' ध्वज का उल्लेख नहीं करता है। –

+1

यदि आप अपने *** सी *** संदर्भ http://en.cppreference.com/w/c/io/fopen :-) – bluss

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

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