我正在尝试像这样更新锁定屏幕背景:
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.
但是,当我在Windows资源管理器,CMD或Powershell中浏览到C:\ Windows \ System32 \ oobe \ info \ backgrounds时,它确实存在。我还具有在该位置编写,重命名和删除文件的安全性(并且C#进程在我的上下文中运行)。发生了什么事?
答案 0 :(得分:2)
如果您遇到此问题,我猜您正在64位版本的Windows上执行该过程。
背景:
在Windows 32位上,有一个名为" System32"的System32文件夹。存储所有32位DLL。在Windows 64位上,有两个" System32"文件夹一个仍称为System32,另一个名为SysWOW64。
这两个文件夹存储的名称与其名称相反:
SysWOW64代表Windows 34位Windows 34位。"因此,它是一个文件夹,用于向后兼容32位进程的32位进程。
为什么会破坏这些东西?
Microsoft痴迷于向后兼容性,因此当他们在64位Windows上添加32位仿真时,他们希望使32位进程运行时系统的位数不可见,并且他们引入了一堆兼容性填充程序(修复程序) 。
其中一个填充程序将%WINDIR%\ System32的IO请求重定向到%WINDIR%\ SysWOW64,仅用于以32位模式运行的进程。
所以当你请求搬迁时:
C:\Windows\System32\oobe\info\backgrounds\backgroundDefault.jpg
Windows实际上可能会从以下位置请求移动:
C:\Windows\SysWOW64\oobe\info\backgrounds\backgroundDefault.jpg
哪个不存在。从而解释了您所看到的错误。
修复
最简单的解决方法是将程序更改为64位进程。您可以通过以下方式执行此操作:
右键单击项目 - >属性 - >构建[Tab] - >平台目标 - > 64
现在,当您运行时,针对%WINDIR%\ System32的请求实际上应该命中%WINDIR%\ System32 for real。
或者,如果您需要以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中的任何其他操作)。