2012-02-08 9 views
17

मैंने हमेशा यह माना है कि उत्तर हाँ है, लेकिन अब मैं सच खोजने की कोशिश कर रहा हूं।Path.GetTempFileName के साथ बनाई गई फाइलें स्वचालित रूप से साफ़ हो जाती हैं?

जब मैं Path.GetTempFileName() का उपयोग कर एक temp फ़ाइल बनाता हूं, तो विंडोज़ बाद में इसे स्वचालित रूप से साफ़ कर देगा?

यदि मैं Path.GetTempPath() के अंतर्गत निर्देशिका बना रहा हूं तो क्या होगा? क्या विंडोज़ इसे साफ़ कर देगा?

या क्या यह डेवलपर की जिम्मेदारी है जो वहां बनाई गई फ़ाइलों को हटाने के लिए है?

उत्तर

4

नहीं। यह नहीं होगा। यही कारण है कि http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename.aspx विशेष रूप से बताता है कि "GetTempFileName विधि IOException को बढ़ाएगी यदि कोई अद्वितीय अस्थायी फ़ाइल नाम उपलब्ध नहीं है। इस त्रुटि को हल करने के लिए, सभी अनएडेड अस्थायी फ़ाइलों को हटाएं।"

10

नहीं, वे स्वचालित रूप से हटाए नहीं जाते हैं। फ़ाइल बनाने के लिए स्वचालित रूप से हटाए जाने पर स्वचालित रूप से हटा दिया जाएगा, FILE_FLAG_DELETE_ON_CLOSECreateFile पर पास करें।

फ़ाइल को अपने सभी हैंडल बंद होने के तुरंत बाद हटा दिया जाना चाहिए, जिसमें निर्दिष्ट हैंडल और कोई अन्य खुला या डुप्लिकेट हैंडल शामिल है। यदि फ़ाइल में मौजूदा खुले हैंडल हैं, तो कॉल विफल रहता है जब तक कि वे सभी FILE_SHARE_DELETE शेयर मोड के साथ खोले गए। फ़ाइल के लिए बाद के खुले अनुरोध विफल हो जाते हैं, जब तक कि FILE_SHARE_DELETE साझा मोड निर्दिष्ट नहीं है।

.net से इस Win32 कार्यक्षमता तक पहुंच प्राप्त करने के लिए, SafeFileHandle कक्षा का उपयोग करें।

+1

'FILE_ATTRIBUTE_TEMPORARY' स्वचालित रूप से फ़ाइल को नहीं हटाएगा। यह ध्वज केवल ओएस को इंगित करता है कि जितनी ज्यादा हो सके फ़ाइल को कैश करने की कोशिश करें और संभावित रूप से भौतिक माध्यम से गुजरें। जो ध्वज आप चाहते हैं वह 'FILE_FLAG_DELETE_ON_CLOSE' है। –

+0

@ जेसीसी। लिक्सर आप सही हैं, मेरे हिस्से पर मस्तिष्क स्थिर है। अब मैंने सही किया है। धन्यवाद। –

+0

कोई समस्या नहीं, महोदय! जानकारी के लिए +1। –

4

मेरे विंडोज फॉर्म & WPF ऐप्स के लिए, मैंने ऐप बंद होने पर फ़ाइल को हटाने के लिए एक ईवेंट जोड़ा। इस तरह:

private string GetTempFile() { 
    string tmpfile = Path.GetTempFileName(); 
    this.Closed += (object sender, EventArgs e) => { 
     if (File.Exists(tmpfile)) 
      File.Delete(tmpfile); 
    }; 
    return tmpfile; 
} 
1

यह विधि मेरे लिए अच्छी तरह से काम करती है। जब उद्घाटन प्रोग्राम बंद हो जाता है तब ट्रैक करें और फिर फ़ाइल को हटाने का प्रयास करें।

//Open it now and cleanup when program closes 
Process p = Process.Start(path); 
p.EnableRaisingEvents = true; 
p.Exited += (sender, e) => 
{ 
    try 
    { 
     File.Delete(path); 
    } 
    catch { } //Suppress errors 
}; 
1

सवाल का जवाब नहीं है, और आप शायद नोटिस नहीं करेंगे जब तक आप tmpFFFF.tmp तक पहुँचने और कोई त्रुटि मिलती है। यदि यह वेबसर्वर पर है तो आपका ऑपरेशन विफल हो जा रहा है।

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

C:\Users\sweaver\AppData\Local\Temp\2\tmp4193.tmp 

और AppPool के लिए Load User Profile = True साथ IIS में मुझे मिलता है:

C:\Users\APPPOOL_NAME\AppData\Local\Temp

और जब

Windows 8 पर एक कंसोल एप्लिकेशन के रूप में चल रहा है मुझे मेरे स्थानीय prpofile में एक रास्ता देता है Load User Profile = False मुझे और अधिक प्रबंधनीय मिलता है:

C:\Windows\TEMP\tmp7C32.tmp 

आप इससे बचने के लिए तुरंत अपनी temp फ़ाइलों को साफ़ करना चाहते हैं!

+0

देखें कि क्या आप एक टीएमपी फाइल बनाते हैं और तुरंत इसे हटा देते हैं। कभी-कभी वायरस सुरक्षा सॉफ्टवेयर कूद जाएगा और इसे स्कैन करने का प्रयास करेगा और फिर आपको इसे हटाने से रोक देगा। –

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

  • कोई संबंधित समस्या नहीं^_^