18

नेट में हम 'विशेष फ़ोल्डर' जैसे दस्तावेज़ों/डेस्कटॉप आदि जैसे पथों को पुनः प्राप्त कर सकते हैं। आज मैंने 'डाउनलोड' फ़ोल्डर का मार्ग पाने का कोई तरीका खोजने का प्रयास किया, लेकिन ऐसा लगता है कि यह पर्याप्त नहीं है।विंडोज़ डाउनलोड फ़ोल्डर "% USERPROFILE%/डाउनलोड" प्रोग्रामेटिक रूप से कैसे प्राप्त करें?

मुझे पता है कि मैं केवल 'सी: \ उपयोगकर्ता \ उपयोगकर्ता नाम \ डाउनलोड' कर सकता हूं, लेकिन यह एक बदसूरत समाधान लगता है। तो मैं नेट का उपयोग कर पथ को कैसे पुनः प्राप्त कर सकता हूं?

उत्तर

0

की समस्या अपने पहला जवाब यह है कि यदि आपको डिफ़ॉल्ट डाउनलोड डिर को [डाउनलोड 1] में बदल दिया गया है तो यह आपको गलत परिणाम देगा! उचित तरीके से यह सभी संभावनाओं को कवर है

using System; 
using System.Runtime.InteropServices; 

static class cGetEnvVars_WinExp { 
    [DllImport("Shell32.dll")] private static extern int SHGetKnownFolderPath(
     [MarshalAs(UnmanagedType.LPStruct)]Guid rfid, uint dwFlags, IntPtr hToken, 
     out IntPtr ppszPath); 

    [Flags] public enum KnownFolderFlags : uint { SimpleIDList = 0x00000100 
     , NotParentRelative = 0x00000200, DefaultPath = 0x00000400, Init = 0x00000800 
     , NoAlias = 0x00001000, DontUnexpand = 0x00002000, DontVerify = 0x00004000 
     , Create = 0x00008000,NoAppcontainerRedirection = 0x00010000, AliasOnly = 0x80000000 
    } 
    public static string GetPath(string RegStrName, KnownFolderFlags flags, bool defaultUser) { 
     IntPtr outPath; 
     int result = 
      SHGetKnownFolderPath (
       new Guid(RegStrName), (uint)flags, new IntPtr(defaultUser ? -1 : 0), out outPath 
      ); 
     if (result >= 0)   { 
      return Marshal.PtrToStringUni(outPath); 
     } else { 
      throw new ExternalException("Unable to retrieve the known folder path. It may not " 
       + "be available on this system.", result); 
     } 
    } 

} 

यह परीक्षण करने के लिए, यदि आप विशेष रूप से अपने व्यक्तिगत डाउनलोड dir की इच्छा आप गलत पर झंडा डिफ़ॉल्ट करने के लिए, ->

using System.IO; 
class Program { 
    [STAThread] 
    static void Main(string[] args)  { 
     string path2Downloads = string.Empty; 
     path2Downloads = 
      cGetEnvVars_WinExp.GetPath("{374DE290-123F-4565-9164-39C4925E467B}", cGetEnvVars_WinExp.KnownFolderFlags.DontVerify, false); 
     string[] files = { "" }; 
     if (Directory.Exists(path2Downloads)) { 
      files = Directory.GetFiles(path2Downloads); 
     } 
    }//Main 
} 

या सिर्फ एक लाइन [ पर्यावरण का उपयोग करना। एक्सपैंड पर्यावरण पर्यावरण()]>> (सबसे सरल समाधान)

using System.IO; 
class Program { 
    [STAThread] 
    static void Main(string[] args)  { 
     string path2Downloads = string.Empty; 
     string[] files = { "" }; 
     path2Downloads = Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads"); 
     if (Directory.Exists(path2Downloads)) { 
      files = Directory.GetFiles(path2Downloads); 
     } 
    }//Main 
} 
19

हां यह विशेष है, इस फ़ोल्डर का नाम खोजना Vista तक संभव नहीं हुआ। .NET को अभी भी पूर्व ऑपरेटिंग सिस्टम का समर्थन करने की आवश्यकता है। आप इस तरह इस सीमा को बायपास करने, SHGetKnownFolderPath() PInvoke कर सकते हैं:

using System.Runtime.InteropServices; 
... 

public static string GetDownloadsPath() { 
    if (Environment.OSVersion.Version.Major < 6) throw new NotSupportedException(); 
    IntPtr pathPtr = IntPtr.Zero; 
    try { 
     SHGetKnownFolderPath(ref FolderDownloads, 0, IntPtr.Zero, out pathPtr); 
     return Marshal.PtrToStringUni(pathPtr); 
    } 
    finally { 
     Marshal.FreeCoTaskMem(pathPtr); 
    } 
} 

private static Guid FolderDownloads = new Guid("374DE290-123F-4565-9164-39C4925E467B"); 
[DllImport("shell32.dll", CharSet = CharSet.Auto)] 
private static extern int SHGetKnownFolderPath(ref Guid id, int flags, IntPtr token, out IntPtr path); 
+1

Vista से पहले स्थानीयकृत विंडोज़ पर यह काम करने का कोई तरीका है? अर्थात। 'पथ। कॉम्बाइन (पथ, "डाउनलोड");' काम नहीं करेगा, क्योंकि फ़ोल्डर को 'टेलेचार्जमेंट' कहा जाता है, न कि 'डाउनलोड'। –

+0

आप शायद इसे कहीं रजिस्ट्री से खोद सकते हैं। मुझे नहीं पता कि, मैं बहुत समय पहले एक्सपी सेवानिवृत्त हुआ था। Regedit.exe इसे वापस ढूंढने के लिए उपयोगी है। –

+0

'SHGetKnownFolderPath' का उपयोग क्यों करें और 'पर्यावरण। SpecialFolder' नहीं? – Kiquenet

-3

वीबी के लिए, कोशिश ...

Dim strNewPath As String = IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)) + "\Downloads\" 
+1

यह गलत है, एस। मेरी टिप्पणियां यहां: http://www.codeproject.com/Articles/878605/Getting-all- विशेष- फ़ोल्डर्स-in-NET –

+0

यहां हार्ड कोड पथ न करें। उपयोगकर्ता ने फ़ोल्डर को दूसरे स्थान पर ले जाया होगा (जो 8, 8.1 और 10 में काफी आसान है) ... –

0

मैं कोशिश करेंगे:

Dim Dd As String = Environment.GetFolderPath(Environment.SpecialFolder.Favorites) 
Dim downloD As String = Dd.Replace("Favorites", "Downloads") 
txt1.text = downLoD 
+0

6 साल पहले पोस्ट किए गए एक प्रश्न का उत्तर पोस्ट करना और उत्तर दें - कृपया बताएं कि आपका समाधान उपयोग करने के लिए बेहतर क्यों है मौजूदा एक –

+0

*** कृपया बताएं कि मौजूदा समाधान की तुलना में आपका समाधान बेहतर क्यों है ***? बेहतर 'SHGetKnownFolderPath' का उपयोग न करें? – Kiquenet

+2

** भगवान समाधान नहीं: ** 'उपयोगकर्ता ने फ़ोल्डर को दूसरे स्थान पर ले जाया है (जो 8, 8.1 और 10 में काफी आसान है)।' [.NET में सभी "विशेष फ़ोल्डर" प्राप्त करना] (https: // www.codeproject.com/articles/878605/getting-all-special- फ़ोल्डर्स-in-net) – Kiquenet