Windowsのダウンロードフォルダー「%userprofile%/downloads」をプログラム的に導き出す方法は?
-
05-10-2019 - |
質問
.NETでは、ドキュメント/デスクトップなどのような「特別なフォルダー」へのパスを再取得できます。今日、「ダウンロード」フォルダーへのパスを取得する方法を見つけようとしましたが、それは十分に特別ではありません。
'c: users username downloads'を実行できることは知っていますが、それは醜い解決策のようです。では、.NETを使用してパスを再取得するにはどうすればよいですか?
解決
最初の答えの問題は、デフォルトのダウンロードdirが[download1]に変更された場合、間違った結果を与えることです!すべての可能性をカバーする適切な方法は
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);
}
}
}
それをテストするには、個人的なダウンロード監督を特に望んでいる場合、デフォルトにフラグを立ててください - >
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
}
または、1つのライン環境のみ。
using System.IO;
class Program {
/* https://ss64.com/nt/syntax-variables.html */
[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
}
他のヒント
はい、それは特別です。このフォルダーの名前が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);
これを試して:
string path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)+ @"\Downloads";
以下のコードを使用しましたが、Windows 7以降で.NET 4.6で動作します。以下のコードは、ユーザープロファイルフォルダーパスを提供します - > "C:\Users\<username>"
string userProfileFolder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
ダウンロードフォルダーにアクセスするには、以下のように追加のパス文字列を組み合わせるだけです。
string DownloadsFolder = userProfileFolder + "\\Downloads\\";
さて、最終結果は次のとおりです
"C:\Users\<username>\Downloads\"
それが将来誰かのために時間を節約することを願っています。
試す:
Dim Dd As String = Environment.GetFolderPath(Environment.SpecialFolder.Favorites)
Dim downloD As String = Dd.Replace("Favorites", "Downloads")
txt1.text = downLoD
それは単なるトリックであり、解決策ではありません。
VBの場合は...
Dim strNewPath As String = IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)) + "\Downloads\"