无法找到路径的一部分,"在确实存在的路径上
本文关键字:路径 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中的任何其他操作)。