我需要访问文件夹中的内容%AppData%RoamingMicrosoft
.
这通常可以通过执行以下操作来正常工作:
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft");
问题是现在资源管理器允许您通过右键单击漫游文件夹并将位置设置为其他位置来更改%AppData%
的位置。但是,这不会更改Microsoft文件夹的位置,该文件夹将保留在原始%AppData%
中。
我想过做这样的事情:
string roaming = "C:Users" + Environment.UserName + @"AppDataRoaming";
虽然这看起来很糟糕,看起来很容易破裂。 有什么建议吗?
我不知道.NET是否可以做到,但WinAPI可以。使用SHGFP_TYPE_DEFAULT
标志调用SHGetFolderPath
:
using System;
using System.Runtime.InteropServices;
namespace Test { class TestApp {
public class WinApi
{
public const int CSIDL_APPDATA = 0x1a;
public const int SHGFP_TYPE_DEFAULT = 1;
[DllImport("shell32.dll")]
public static extern int SHGetFolderPath(IntPtr hwnd, int csidl, IntPtr hToken, uint flags, [Out] System.Text.StringBuilder Path);
}
[STAThread]
static void Main()
{
System.Text.StringBuilder builder = new System.Text.StringBuilder(260);
int result = WinApi.SHGetFolderPath(IntPtr.Zero, WinApi.CSIDL_APPDATA, IntPtr.Zero, WinApi.SHGFP_TYPE_DEFAULT, builder);
string path = "";
if (result == 0) path = builder.ToString();
Console.WriteLine(string.Format("{0}:{1}", result, path));
}
} }
您可以尝试使用以下代码访问 %AppData%\Roaming\Microsoft:
string appData= Environment.ExpandEnvironmentVariables("%AppData%");
string roamingMicrosoft = Path.Combine(appData, @"Microsoft");
但我不确定当用户自己更改 AppData 的路径时,Windows 是否默认更改环境变量 %AppData%。