वर्तमान उपयोगकर्ता के लिए अस्थायी फ़ोल्डर कैसे प्राप्त करें


395

वर्तमान में मैं वर्तमान उपयोगकर्ता के लिए अस्थायी फ़ोल्डर पथ प्राप्त करने के लिए निम्नलिखित फ़ंक्शन का उपयोग कर रहा हूं:

string tempPath = System.IO.Path.GetTempPath();

कुछ मशीनों पर यह मुझे वर्तमान उपयोगकर्ता की अस्थायी फ़ोल्डर पथ देता है:

C: \ दस्तावेज़ और सेटिंग्स \ व्यवस्थापक \ स्थानीय सेटिंग्स \ Temp \

कुछ मशीनों पर यह मुझे सिस्टम अस्थायी फ़ोल्डर पथ देता है जैसे:

C: \ Windows \ TEMP

MSDN दस्तावेज़ीकरण यह भी कहता है कि ऊपर API वर्तमान सिस्टम का अस्थायी फ़ोल्डर लौटाता है।

क्या कोई अन्य एपीआई उपलब्ध है जो मुझे वर्तमान उपयोगकर्ता के अस्थायी फ़ोल्डर का रास्ता देता है:

C: \ दस्तावेज़ और सेटिंग्स \ व्यवस्थापक \ स्थानीय सेटिंग्स \ Temp \


2
System.Environment.GetEnvironmentVariable ("TEMP") का व्यवहार GetTempPath () के समान है। खाता 'व्यवस्थापक' के लिए मेरी मशीन में दोनों API "C: \ WINDOWS \ TEMP" लौटाते हैं, लेकिन खाता 'नेटवर्क सेवा' के लिए दोनों API "C: \ Documents and Settings \ Network Service \ Local Settings \ Temp \" देता है।
अनूप

1
शायद 'व्यवस्थापक' खाते में वास्तव में C: \ Windows \ Temp का अस्थायी फ़ोल्डर है?
हेलेन

2
क्या कोई विशेष कारण है कि आप C: \ Documents and Settings \ हमेशा के तहत अस्थायी पथ प्राप्त करना चाहते हैं?
नोल्डोरिन

11
जानकारी के लिए: आप अगर है प्रणाली अस्थायी फ़ोल्डर चाहते हैं, नहीं उपयोगकर्ता के (यदि सेट) आप Environment.GetEnvironmentVariable ( "अस्थायी", EnvironmentVariableTarget.Machine) का उपयोग कर सकते
piers7

1
अतीत में, मैंने अक्सर अस्थायी फ़ोल्डरों का उपयोग किया है और कभी भी परवाह नहीं की कि वह कहाँ था, जब तक सफाई हो सकती है इसलिए डिस्क पूरी तरह से खपत नहीं होती है। अस्थायी उपयोग के लिए एक अस्थायी फ़ोल्डर की बात नहीं है - जंक प्लेसहोल्डर? यह API द्वारा अज्ञात और नियंत्रित क्यों नहीं किया जा सकता है? क्या आपको अस्थायी के बजाय एक विन्यास योग्य, प्रसिद्ध स्थान का उपयोग करना चाहिए?
बैरीपिकर

जवाबों:


405

System.IO.Path.GetTempPath()केवल कर्नेल 32 में एक देशी कॉल के लिए एक आवरण है GetTempPath(..)

Http://msdn.microsoft.com/en-us/library/aa364992(VS.858.bx पर एक नज़र डालें

उस पेज से कॉपी किया गया:

GetTempPath फ़ंक्शन निम्न क्रम में पर्यावरण चर के अस्तित्व के लिए जाँच करता है और पहले पथ का उपयोग करता है:

  • TMP पर्यावरण चर द्वारा निर्दिष्ट पथ।
  • TEMP पर्यावरण चर द्वारा निर्दिष्ट पथ।
  • USERPROFILE पर्यावरण चर द्वारा निर्दिष्ट पथ।
  • विंडोज निर्देशिका।

यह पूरी तरह से मेरे लिए स्पष्ट नहीं है कि क्या "विंडोज निर्देशिका" का अर्थ है खिड़कियों के नीचे अस्थायी निर्देशिका या स्वयं विंडोज़ निर्देशिका। विंडोज़ निर्देशिका में अस्थायी फ़ाइलों को डंप करना एक अवांछनीय मामले की तरह लगता है, लेकिन कौन जानता है।

तो उस पेज को अपनी पोस्ट के साथ जोड़कर मैं अनुमान लगाऊंगा कि आपके व्यवस्थापक उपयोगकर्ता के लिए TMP, TEMP या USERPROFILE चरों में से कोई एक विंडोज़ पथ पर इंगित करता है, या फिर वे सेट नहीं होते हैं और यह विंडो अस्थायी पथ पर वापस आ रहा है।


14
TEMPवातावरण चर दो स्थानों में सेट किया जाएगा: अपने आप में उपयोगकर्ता के लिए, और स्थानीय मशीन के लिए। यदि यह उपयोगकर्ता के लिए सेट नहीं है, तो स्थानीय मशीन के लिए एक का उपयोग किया जाएगा, और यह हमेशा डिफ़ॉल्ट स्थापना में सेट होता है। इसलिए खोज आम तौर पर दूसरे चरण पर रुक जाती है। में परीक्षण, अगर TMP, TEMPऔर USERPROFILEसभी को सेट किए बिना कर रहे हैं, यह वास्तव में करता है को गिरावट वापस %SystemRoot%( C:\Windows\)।
बॉब

1
कोड जो विंडोज सेवाओं में निष्पादित किया जाता है जो "स्थानीय सिस्टम" के तहत या ऐसी सेवा द्वारा शुरू किए गए अनुप्रयोगों में, C: \ Windows \ Temp फ़ोल्डर को कभी-कभी अस्थायी फ़ोल्डर के रूप में उपयोग किया जाता है।
नौबेटी

1
आपके लिंक से दस्तावेज़ीकरण यह कहता है: "लौटा हुआ स्ट्रिंग बैकस्लैश के साथ समाप्त होता है, उदाहरण के लिए," C: \EMEMP "। लेकिन उनका उदाहरण वास्तव में बैकस्लैश के साथ समाप्त नहीं होता है।
dcp

आपको इस बात की गारंटी नहीं है कि आपके आवेदन में उस फ़ंक्शन द्वारा दिए गए पथ के लिए आपको लिखित अनुमति होगी। अगर आपने इसके बजाय IsolatedStorage की कोशिश की तो क्या होगा?
जॉन

35

इसका उपयोग करें:

System.Environment.GetEnvironmentVariable("TEMP")

पर्यावरण चर को ओवरराइड किया जा सकता है, इसलिए TEMPचर जरूरी निर्देशिका नहीं है।

सही तरीका यह है System.IO.Path.GetTempPath()कि स्वीकृत उत्तर में उपयोग किया जाए।


34
@ImmortalBlue क्योंकि यह जरूरी नहीं कि अस्थायी निर्देशिका हो। अस्थायी निर्देशिका प्राप्त करने का सही तरीका कॉल करना है System.IO.Path.GetTempPath()
डेविड हेफर्नन

9
मुझे पता है कि यह बहुत पुराना है, लेकिन मुझे लगा कि मैं किसी को भी उत्सुक होने के लिए एक नोट छोड़ दूंगा: न केवल यह जरूरी नहीं कि अस्थायी निर्देशिका हो, जैसा कि @DavidHeffernan ने कहा, लेकिन आपके पास कोई सुराग नहीं है कि यह क्या है। जबकि .NET के साथ कोई समस्या नहीं है, यह खराब व्यवहार माना जाता है क्योंकि कोई भी दुर्भावनापूर्ण उपयोगकर्ता अपने प्रोग्राम का फायदा उठाने के लिए उस पर्यावरण चर को बदल सकता है। यदि आप व्यवस्थापक विशेषाधिकारों के साथ चल रहे हैं और मैलवेयर आपके कोड को बदल सकता है, जैसा कि वे निष्पादित कर रहे हैं, वे, उदाहरण के लिए, शेलकोड को एक व्यवस्थापक के रूप में निष्पादित कर सकते हैं क्योंकि यह TEMP में संग्रहीत किया गया है।
sraboy

के बीच 2 मुख्य अंतर हैं GetEnvironmentVariable("TEMP")और GetTempPath()GetTempPath()पहले "TMP" वैरिएबल के लिए चेक करता है और फिर "TEMP" और अंत में "USERPROFILE"। अगर उन लोगों को इसका कोई रिटर्न विंडोज फोल्डर में नहीं मिलता है। यह भी गारंटी देता है कि यह सही रास्ता लौटाता है लेकिन यह गारंटी नहीं है कि रास्ता मौजूद है।
लोगमैन

लेकिन यह ठीक वैसा ही है जैसा कि यदि आपके पास TMP वैरिएबल नहीं है (हाल ही के विंडोज़ संस्करणों पर डिफ़ॉल्ट परिदृश्य), तो क्या यह उत्तर नहीं है?
PRMan

1
GetTempPathयदि आप कर्नेल प्रलेखन को पढ़ते हैं, तो वैसे भी आपके पर्यावरण चर पर निर्भर करता है, इसलिए जैसा कि उपयोगकर्ता लोगमैन बताते हैं कि उपयोग नहीं करने का कोई कारण नहीं है GetEnvironmentVariable... उन दोनों में एक ही कमजोरी है।
21

22

मेरी यही आवश्यकता है - हम लॉग को एक विशिष्ट रूट डायरेक्टरी में रखना चाहते हैं जो पर्यावरण के भीतर मौजूद होनी चाहिए।

public static readonly string DefaultLogFilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

यदि मैं इसे एक उप-निर्देशिका के साथ जोड़ना चाहता हूं, तो मुझे इसका उपयोग करने में सक्षम होना चाहिए Path.Combine( ... )

GetFolderPathविधि है जो निर्दिष्ट पथ बनाया या बस सत्यापित किया जाना है कि क्या आप को नियंत्रित करने के लिए अनुमति देता है विशेष फ़ोल्डर विकल्प के लिए एक अधिभार नहीं है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.