исполняемый файл, который печатает только желаемый путь к стандартному выводу. Затем вывод читается в основном приложении, и вы получаете реальный путь.

учил несколько странную ошибку при попытке решить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 \ Shell Folders \ Common Documents), но оно не возвращаетсяSHGetKnownFolderPath (или жеEnvironment.GetFolderPath)

ОС: Windows 7 Профессиональная x64
.NET Framework v4.0.30319 Приложение скомпилировано дляпроцессор x86

Что я пробовал до сих пор:

перезапуск моего приложенияперезагрузка компьютерапризваниеEnvironment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);прямые вызовы Win32-API SHGetKnownFolderPath

РЕДАКТИРОВАТЬ 2 Действия по воспроизведению:

деактивируйте UAC на вашем компьютере [и перезапустите!]перейдите в C: \ Users \ Public \ щелкните правой кнопкой мыши на папке «Public Documents» и выберитевыберите вкладку «Путь»Propertiesнажмите «Переместить ...» и выберите (новую) папку на диске называетсяD:нажмите «Применить»TestDocumentsпринять, чтобы переместить все файлы на новое место, запустите минимальное приложение вышеЯ подозреваю, что перенаправление / перемещение не выполняется должным образом ... обычно такое изменение может быть сделано с помощью некоторой групповой политики ... и есть также аспект "локализации" (реальная папка имеет имя, отличное от отображаемого ), который, кажется, играет роль в вашем случае ...

Ответы на вопрос(1)

Ваш ответ на вопрос