Problem swoje Pierwsza odpowiedź brzmi: NIEPOPRAWNY wynik, jeśli domyślny katalog do pobrania został zmieniony na [Pobierz1]! Właściwym sposobem na to jest obejmujące wszystkie możliwości
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);
}
}
}
By to sprawdzić, jeśli specjalnie pragnienie osobistego pobierania dir, Ci domyślnie false flag ->
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
}
czy tylko jeden wiersz [ wykorzystujące Environment.ExpandEnvironmentVariables()] -> (najprostsze rozwiązanie)
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
}
Czy istnieje sposób, aby to działało na zlokalizowanym systemie Windows przed Vista? To znaczy. 'Path.Combine (path," Downloads ");' nie zadziała, ponieważ folder nazywa się 'Téléchargements', a nie' Downloads'. –
Prawdopodobnie możesz go gdzieś wykopać z rejestru. Nie wiem, gdzie dawno temu przeszedłem na emeryturę. Regedit.exe przydaje się, aby go odzyskać. –
Dlaczego warto używać 'SHGetKnownFolderPath', a nie' Environment.SpecialFolder'? – Kiquenet