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
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
}
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);
Pour VB, essayez ...
Dim strNewPath As String = IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)) + "\Downloads\"
C'est faux, art. mes remarques ici: http://www.codeproject.com/Articles/878605/Getting-all-Special-Folders-in-NET –
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) ... –
Je voudrais essayer:
Dim Dd As String = Environment.GetFolderPath(Environment.SpecialFolder.Favorites)
Dim downloD As String = Dd.Replace("Favorites", "Downloads")
txt1.text = downLoD
Poster une réponse à une question postée il y a 6 ans - Veuillez expliquer pourquoi votre solution est meilleure à utiliser que –
*** S'il vous plaît expliquer pourquoi votre solution est meilleure à utiliser que l'existant ***? Mieux vaut ne pas utiliser 'SHGetKnownFolderPath'? – Kiquenet
** 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
- 1. Comment puis-je trouver par programme le dossier Windows Fax Personal CoverPages?
- 2. Comment télécharge-t-on par programme des fichiers depuis le web?
- 3. Trouver le dossier Windows par programmation dans C#
- 4. Comment arrêter un service Windows par programme?
- 5. Comment accéder par programme au dossier "Vidéo" de l'ipad
- 6. Capistrano télécharge le répertoire .git
- 7. Dossier dans le dossier du menu Programme pour WiX 3
- 8. Comment obtenir le programme d'installation de Windows Phone 7 Developer Tool sans télécharger tout le programme?
- 9. Définir par programme l'icône de dossier/répertoire personnalisée sous Linux
- 10. Installation du service Windows par programme
- 11. Auto Détecter le périphérique Windows Mobile par programme
- 12. Comment démarrer le programme Windows Mobile?
- 13. Désinstallation de Windows Service par programme .NET
- 14. Modifier l'utilisateur du service Windows par programme
- 15. Autoriser par programme ClearType dans Windows Mobile
- 16. Windows Vista/7 Connectez-vous par programme
- 17. Surveillance par programme des fichiers sous Windows
- 18. Comment modifier le format de papier par défaut dans Windows par programme?
- 19. Comment puis-je actualiser par programme Windows Explorer?
- 20. Obtenir par programme des statistiques réseau par processus sur Windows?
- 21. Comment obtenir le GUID d'un sous-dossier dans une bibliothèque de documents par programme
- 22. Modification du nom du dossier SPFolder par programme
- 23. MacOS - comment changer le dossier temporaire du système (par programmation)?
- 24. Créer un nouveau dossier en utilisant le programme Java sur les machines Windows et Linux
- 25. Comment installer le service Windows sans étendre le programme d'installation?
- 26. Comment activer le programme Wake on LAN par programme
- 27. Comment invoquer le compilateur C++ par programme?
- 28. Comment définir le style par programme
- 29. Comment lancer le programme généré par pyuic4?
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'. –
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. –
Pourquoi utiliser 'SHGetKnownFolderPath' et non' Environment.SpecialFolder'? – Kiquenet