“无法找到路径的一部分”,在确实存在的路径上

时间:2015-07-09 16:36:54

标签: c#

我正在尝试像这样更新锁定屏幕背景:

 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#进程在我的上下文中运行)。发生了什么事?

1 个答案:

答案 0 :(得分:2)

如果您遇到此问题,我猜您正在64位版本的Windows上执行该过程。

背景

在Windows 32位上,有一个名为" System32"的System32文件夹。存储所有32位DLL。在Windows 64位上,有两个" System32"文件夹一个仍称为System32,另一个名为SysWOW64。

这两个文件夹存储的名称与其名称相反:

  • System32存储64位DLL。
  • SysWOW64存储32位DLL。

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中的任何其他操作)。