2015-07-09 5 views
0

Я пытаюсь обновить экран блокировки фона, как это:«Не удалось найти часть пути,» на пути, который действительно существует

string filename = @"C:\app\screenshot.temp.jpg"; 
string finalLocation = @"C:\Windows\System32\oobe\info\backgrounds\backgroundDefault.jpg"; 
File.Move(filename, finalLocation); 

К сожалению, это бросает исключение System.IO.DirectoryNotFoundException:

An unhandled exception of type 'System.IO.DirectoryNotFoundException' occurred in mscorlib.dll 
Additional information: Could not find a part of the path. 

Однако, когда я просматриваю C: \ Windows \ System32 \ oobe \ info \ backgrounds в проводнике Windows, CMD или Powershell, он существует. У меня также есть безопасность для записи, переименования и удаления файлов в этом месте (и процесс C# работает в моем контексте). Что происходит?

ответ

2

Если вы столкнулись с этим, я предполагаю, что вы выполняете этот процесс на 64-битной версии Windows.

фон:

В Windows 32 бит, есть одна папка System32 называется "System32", который хранит все 32-разрядные библиотеки DLL. В Windows 64 бит есть две папки System32, которые все еще называются System32, а другая - SysWOW64.

Эти две папки хранят противоположное тому, что означают их имена:

  • System32 хранит 64-битные библиотеки DLL.
  • SysWOW64 хранит 32-разрядные библиотеки DLL.

SysWOW64 означает «Windows 32-bit на Windows 64-bit». Таким образом, это папка, которая существует для обратной совместимости с 32-разрядным для 32-битных процессов.

Почему это ломается?

Microsoft одержим обратной совместимостью, поэтому, когда они добавили 32-битную эмуляцию на 64-битной Windows, они хотели сделать битовую систему невидимой для 32-битных процессов, и они представили пучок совместимых прокладок (исправления).

Один из этих прокладок перенаправляет запросы ввода-вывода для% WINDIR% \ System32 в% WINDIR% \ SysWOW64 для процессов, работающих только в 32-разрядном режиме.

Итак, когда вы запрашиваете переход от:

C:\Windows\System32\oobe\info\backgrounds\backgroundDefault.jpg  

Windows, может на самом деле вместо того, чтобы просить перейти от:

C:\Windows\SysWOW64\oobe\info\backgrounds\backgroundDefault.jpg 

Который не существует. Таким образом, объясняя ошибку, которую вы видите.

Исправление

Самое простое решение, чтобы изменить вашу программу для создания как битовая процесса 64. Вы можете сделать это:

Щелкните правой кнопкой мыши по проекту -> Свойства -> Build [Tab] -> Целевые платформы -> x64

Теперь при запуске, запросы в отношении% WINDIR% \ System32 фактически должны ударить % WINDIR% \ System32 для реального.

В качестве альтернативы, если вы потребность запустить процесс в 32-битном режиме (например, из-за библиотеки совместимости), вы можете попросить Windows, чтобы отключить прокладку так:

[DllImport("kernel32.dll", SetLastError = true)] 
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); 

private static void Main(string[] args) 
{ 
    IntPtr ptr = new IntPtr(); 
    bool isWow64FsRedirectionDisabled = Wow64DisableWow64FsRedirection(ref ptr); 
    } 

В обоих запросах случае следует обращаться более буквально операционной системой, и вы можете обновить фон экрана блокировки (или любую другую операцию в System32).

Смежные вопросы