При попытке разрешить каталог CommonDocuments
я получил несколько странную ошибку.Он продолжает преобразовываться в неправильный каталог после того, как каталог CommonDocuments был перенаправлен / перемещен в новое местоположение с помощью проводника Windows (Свойства-> Путь из контекстного меню).
минимальная рабочаякусок кода будет:
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 \ Папки оболочки \ Общие документы), но не возвращается SHGetKnownFolderPath
(или Environment.GetFolderPath
)
ОС: Windows 7 Professional x64
.NET Framework v4.0.30319 Приложение скомпилировано для x86 CPU
То, что я пробовал до сих пор:
- перезапуск моего приложения
- перезапуск компьютера
- вызов
Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);
- directвызовы Win32-API SHGetKnownFolderPath
EDIT 2 Шаги для воспроизведения:
- отключить UAC на вашем компьютере [и перезапустить!]
- перейдите в C: \ Users \ Public \
- , щелкните правой кнопкой мыши папку «Public Documents» и выберите
Properties
- , выберите вкладку «Путь»
- нажмите «Переместить» и выберите (новую) папку на диске
D:
с именем TestDocuments
- нажмите «Применить»
- принять, чтобы переместить все файлыПосле того, как вы перейдете на новое место, запустите минимальное приложение выше