18

Dans .Net, nous pouvons récupérer les chemins vers des 'dossiers spéciaux', comme Documents/Bureau, etc. Aujourd'hui, j'ai essayé de trouver le chemin vers le dossier 'Downloads', mais ce n'est pas assez spécial. Je sais que je peux juste faire 'C: \ Users \ Username \ Downloads', mais cela semble une solution moche. Alors, comment puis-je récupérer le chemin en utilisant .Net?Comment dériver par programme Windows télécharge le dossier "% USERPROFILE%/Downloads"?

Répondre

0

Le problème de votre La première réponse est que cela vous donnerait un mauvais résultat si le téléchargement par défaut de Dir a été changé en [Download1]! La bonne façon de le faire couvrant toutes les possibilités est

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); 
     } 
    } 

} 

Pour le tester, si vous désirez plus précisément votre téléchargement dir personnel, vous défaut de drapeau false ->

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 
} 

Ou tout simplement une ligne [ using Environment.ExpandEnvironmentVariables()] -> (la solution la plus simple)

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

Oui c'est spécial, découvrir que le nom de ce dossier n'est pas devenu possible jusqu'à Vista. .NET doit toujours prendre en charge les systèmes d'exploitation antérieurs. Vous pouvez Pinvoke SHGetKnownFolderPath() pour contourner cette limitation, comme ceci:

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

Y at-il un moyen de faire ce travail sur Windows localisé, avant Vista? C'est à dire. 'Path.Combine (chemin," Downloads ");' ne fonctionnera pas, puisque le dossier s'appelle 'Téléchargements', pas' Downloads'. –

+0

Vous pouvez probablement le sortir du registre quelque part. Je ne sais pas où, j'ai pris ma retraite XP il y a longtemps. Regedit.exe est utile pour le retrouver. –

+0

Pourquoi utiliser 'SHGetKnownFolderPath' et non' Environment.SpecialFolder'? – Kiquenet

-3

Pour VB, essayez ...

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

C'est faux, art. mes remarques ici: http://www.codeproject.com/Articles/878605/Getting-all-Special-Folders-in-NET –

+0

Ne pas coder les chemins durs ici. L'utilisateur a peut-être déplacé le dossier vers un autre emplacement (ce qui est assez facile en 8, 8.1 et 10) ... –

0

Je voudrais essayer:

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

Poster une réponse à une question postée il y a 6 ans - Veuillez expliquer pourquoi votre solution est meilleure à utiliser que –

+0

*** S'il vous plaît expliquer pourquoi votre solution est meilleure à utiliser que l'existant ***? Mieux vaut ne pas utiliser 'SHGetKnownFolderPath'? – Kiquenet

+2

** Pas de solution divine: ** 'L'utilisateur a peut-être déplacé le dossier vers un autre emplacement (ce qui est assez facile dans 8, 8.1 et 10) .' [Obtenir tous les" Dossiers spéciaux "dans .NET] (https: // www.codeproject.com/articles/878605/getting-all-special-folders-in-net) – Kiquenet

Questions connexes