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

本文关键字:路径 quot 存在 一部分 | 更新日期: 2023-09-27 18:02:07

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

 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'背景时,它确实存在。我还可以安全地在该位置写入、重命名和删除文件(c#进程在我的上下文中运行)。发生了什么事?

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

如果您遇到这种情况,我猜您正在64位版本的Windows上执行该进程。

:

在32位的Windows上,有一个单独的System32文件夹名为"System32",用于存储所有32位的dll。在Windows 64位上,有两个"System32"文件夹,一个仍然叫System32,另一个叫SysWOW64。

这两个文件夹所存储的内容与其名称的含义相反:

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

SysWOW64代表"Windows 32-bit on Windows 64-bit"。因此,它是一个用于向后兼容32位进程的32位文件夹。

为什么这会破坏东西?

微软痴迷于向后兼容性,所以当他们在64位Windows上添加32位仿真时,他们想让系统的位对运行的32位进程不可见,他们引入了一堆兼容性漏洞(修复)。

其中一个shims仅将运行在32位模式下的进程的%WINDIR%'System32的IO请求重定向到%WINDIR%'SysWOW64。

所以当你请求移动时:

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

Windows实际上可能会从

请求移动
 C:'Windows'SysWOW64'oobe'info'backgrounds'backgroundDefault.jpg

不存在。这样就解释了您看到的错误。

修复

最简单的修复方法是将程序更改为64位进程。你可以这样做:

右键单击Project -> Properties -> Build [Tab] -> Platform target -> x64

现在当你运行时,对%WINDIR%'System32的请求实际上应该击中%WINDIR%'System32。

或者,如果您需要以32位模式运行进程(例如,由于库兼容性),您可以要求Windows禁用shim,如下所示:

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