2016-01-11 8 views
5

पर `()` tempfile.mkstemp द्वारा बनाई गई यहाँ मेरी उदाहरण कोड है एक फ़ाइल नहीं निकाल सकते। लेकिन जब मैं अजगर 3.4.4 का उपयोग कर मेरे Windows XP पर चलाने के लिए, यह निम्न त्रुटि उठाया:जो विंडोज

Traceback (most recent call last): 
    File "C:\1.py", line 5, in <module> 
    os.remove(fname) 
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\DOCUME~1\\IEUser\\LOCALS~1\\Temp\\tmp3qv6ppcf.txt' 

हालांकि, जब मैं tempfile.NamedTemporaryFile() का प्रयोग कर एक अस्थायी फ़ाइल बनाने और इसे बंद करने के लिए, यह स्वचालित रूप से हटा दिया।

विंडोज mkstemp द्वारा बनाई गई फ़ाइलों को क्यों नहीं हटा सकता है? मैं गलत कहां कर रहा हूँ?

+0

आप इसे पहले बंद करने की कोशिश की? –

+0

@ IgnacioVazquez-Abrams: हुह? मैंने इसे कहाँ खोल दिया? 'Mkstemp()' सिर्फ फाइल नहीं बना है? मेरे कोड में कोई 'खुला() 'नहीं है और' fname' एक स्ट्रिंग ऑब्जेक्ट है। –

+2

ध्यान दें कि mkstemp() एक खुली फ़ाइल हैंडल के साथ ** ** tuple ** देता है। जब तक आप उस हैंडल को बंद नहीं करते हैं, तब तक फ़ाइल उपयोग में है (... किसी अन्य प्रक्रिया द्वारा: अपना स्वयं का)। यह विंडोज़ पर काम करता है कि os.remove() कैसे काम करता है (_ विंडोज़, जो फ़ाइल में उपयोग की जाने वाली फ़ाइल को हटाने का प्रयास कर रहा है, अपवाद का कारण बनता है; यूनिक्स पर, निर्देशिका प्रविष्टि हटा दी जाती है लेकिन फ़ाइल में आवंटित संग्रहण नहीं है जब तक मूल फ़ाइल अब उपयोग में नहीं है तब तक उपलब्ध कराई गई है)। –

उत्तर

10
the documentation से

:

Creates a temporary file in the most secure manner possible. [...]

[...]

mkstemp() returns a tuple containing an OS-level handle to an open file (as would be returned by os.open()) and the absolute pathname of that file, in that order.

fd, fname = mkstemp(suffix='.txt', text=True) 
os.close(fd) 
os.remove(fname) 
संबंधित मुद्दे