2008-08-21 17 views
14

संभव डुप्लिकेट: एक (अधिमानतः) सुरक्षित करने के लिए लिखने के लिए एक फ़ाइल को खोलने का तरीका:
Creating tempory foldersसी # में अस्थायी फ़ाइल (लिखने के लिए) कैसे बनाएं?

मैं अजगर में tempfile मॉड्यूल की तरह कुछ के लिए देख रहा हूँ। जब भी मैं किया जाता हूं तो इसे हटाना आसान होना चाहिए ...

ऐसा लगता है, .NET में tempfile मॉड्यूल की "बैटरी शामिल" विशेषताएं नहीं हैं, जो न केवल फ़ाइल बनाता है, बल्कि फ़ाइल डिस्क्रिप्टर देता है (पुराना स्कूल, मुझे पता है ...) पथ के साथ इसके लिए। https://docs.python.org/library/tempfile.html


आह, हाँ, मुझे लगता है कि देख सकते हैं: एक ही समय में, यह सुनिश्चित करें कि केवल बनाने उपयोगकर्ता फ़ाइल और whatnot (mkstemp() मुझे लगता है कि) का उपयोग कर सकते बनाता है। लेकिन GetTempFileName में कोई कमी है: फ़ाइल बनाने के दौरान एक दौड़ स्थिति है (GetTempFileName को 0-बाइट फ़ाइल बनाने के लिए कॉल पर) और जब मैं इसे खोलने के लिए (GetTempFileName की वापसी के बाद) प्राप्त करता हूं। यह एक सुरक्षा समस्या हो सकती है, हालांकि मेरे वर्तमान अनुप्रयोग के लिए नहीं ...

+0

मैं Path.GetTempDirectory नहीं देखा है, यह System.IO.GetTempPath नहीं है? – Biri

उत्तर

0

मुझे ऐसा करने के लिए कक्षाओं में (किसी भी ढांचे के भीतर) के बारे में पता नहीं है, लेकिन मुझे लगता है कि यह बहुत अधिक नहीं होगा एक मुद्दा रोल करने अपनी खुद की ..

जाहिर है यह आप इसे करने के लिखना चाहते हैं डेटा के प्रकार पर निर्भर करता है, और "सुरक्षा" की आवश्यकता ..

This article DevFusion पर हो सकता है एक अच्छी जगह शुरू करने के लिए?

6

पथ। गेटटेम्फ फ़ाइल नाम और पथ। गेटटेम्पाथ। फिर आप फ़ाइल में एन्क्रिप्टेड डेटा को पढ़ने/लिखने के लिए this link का उपयोग कर सकते हैं।

नोट, .NET महत्वपूर्ण सुरक्षा ऐप्स के लिए सबसे अच्छा मंच नहीं है। आपको सीआरआर कैसे काम करता है इस बारे में अच्छी तरह से पता होना चाहिए कि कुछ महत्वपूर्ण नुकसान से बचने के लिए जो हैकर को आपके महत्वपूर्ण डेटा का पर्दाफाश कर सकते हैं।

संपादित करें: रेस स्थिति के बारे में ... आप GetTempPath इस्तेमाल कर सकते हैं, तो एक अस्थायी फ़ाइल नाम

Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(), ".TMP")) 
+0

@ मैसीज: सही! – Will

23

का उपयोग करके बनाने मैं भी यही आवश्यकता से पहले मिला है, और मैं एक छोटे से वर्ग बना लिया है इसे हल करने के लिए:

public sealed class TemporaryFile : IDisposable { 
    public TemporaryFile() : 
    this(Path.GetTempPath()) { } 

    public TemporaryFile(string directory) { 
    Create(Path.Combine(directory, Path.GetRandomFileName())); 
    } 

    ~TemporaryFile() { 
    Delete(); 
    } 

    public void Dispose() { 
    Delete(); 
    GC.SuppressFinalize(this); 
    } 

    public string FilePath { get; private set; } 

    private void Create(string path) { 
    FilePath = path; 
    using (File.Create(FilePath)) { }; 
    } 

    private void Delete() { 
    if (FilePath == null) return; 
    File.Delete(FilePath); 
    FilePath = null; 
    } 
} 

यह आपके द्वारा निर्दिष्ट फ़ोल्डर में या सिस्टम अस्थायी फ़ोल्डर में एक अस्थायी फ़ाइल बनाता है। यह एक डिस्पोजेबल वर्ग है, इसलिए इसके जीवन के अंत में (या तो Dispose या विनाशक), यह फ़ाइल को हटा देता है। आपको FilePath संपत्ति के माध्यम से बनाई गई फ़ाइल (और पथ) का नाम मिलता है। आप इसे लिखने के लिए फ़ाइल को खोलने के लिए निश्चित रूप से विस्तार कर सकते हैं और इसके संबंधित FileStream वापस कर सकते हैं।

एक उदाहरण उपयोग:

using (var tempFile = new TemporaryFile()) { 
    // use the file through tempFile.FilePath... 
} 
+0

फाइनलराइज़र विधियों जैसे ~ अस्थायीफाइल खतरनाक हैं, है ??? – Kiquenet

+12

एक तलवार खतरनाक है? या क्या यह समुराई है जो इसे नियंत्रित करता है? –

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