当我尝试解析CommonDocuments
目录时,遇到了一个有点奇怪的错误。在使用 Windows Explorer(属性->从上下文菜单中选择路径)将 CommonDocuments 目录重定向/移动到新位置之后,它仍然会解析到错误的目录。
一个最小化的工作代码如下:
namespace CommonDocumentsTest
{
class Program
{
private static readonly Guid CommonDocumentsGuid = new Guid("ED4824AF-DCE4-45A8-81E2-FC7965083634");
[Flags]
public enum KnownFolderFlag : uint
{
None = 0x0,
CREATE = 0x8000,
DONT_VERFIY = 0x4000,
DONT_UNEXPAND= 0x2000,
NO_ALIAS = 0x1000,
INIT = 0x800,
DEFAULT_PATH = 0x400,
NOT_PARENT_RELATIVE = 0x200,
SIMPLE_IDLIST = 0x100,
ALIAS_ONLY = 0x80000000
}
[DllImport("shell32.dll")]
static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath);
static void Main(string[] args)
{
KnownFolderFlag[] flags = new KnownFolderFlag[] {
KnownFolderFlag.None,
KnownFolderFlag.ALIAS_ONLY | KnownFolderFlag.DONT_VERFIY,
KnownFolderFlag.DEFAULT_PATH | KnownFolderFlag.NOT_PARENT_RELATIVE,
};
foreach (var flag in flags)
{
Console.WriteLine(string.Format("{0}; P/Invoke==>{1}", flag, pinvokePath(flag)));
}
Console.ReadLine();
}
private static string pinvokePath(KnownFolderFlag flags)
{
IntPtr pPath;
SHGetKnownFolderPath(CommonDocumentsGuid, (uint)flags, IntPtr.Zero, out pPath); // public documents
string path = System.Runtime.InteropServices.Marshal.PtrToStringUni(pPath);
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(pPath);
return path;
}
}
}
期望的行为:
输出为D:\TestDocuments
实际的行为:
输出为C:\Users\Public\Documents
没有;P/Invoke==>C:\Users\Public\Documents
DONT_VERFIY,ALIAS_ONLY;P/Invoke==>
NOT_PARENT_RELATIVE,DEFAULT_PATH;P/Invoke==>C:\Users\Public\Documents
正确的值存储在Windows注册表中(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Common Documents),但SHGetKnownFolderPath
(或Environment.GetFolderPath
)没有返回该值。
操作系统:Windows 7 Professional x64
.NET Framework v4.0.30319
应用程序是针对x86 CPU编译的
我尝试过:
- 重新启动我的应用程序
- 重新启动计算机
- 调用
Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);
- P/Invoke直接调用Win32-API SHGetKnownFolderPath
编辑2 重现步骤:
- 在您的计算机上停用UAC [并重新启动!]
- 转到C:\Users\Public\
- 右键单击“公共文档”文件夹,然后选择
属性
- 选择“路径”选项卡
- 单击“移动...”并选择一个名为
TestDocuments
的驱动器D:
上的(新)文件夹 - 单击“应用”
- 同意将所有文件移动到新位置,开始执行上面的最小应用程序
Environment.SpecialFolder.CommonDocuments
呢? - qJake