System32 中的 Ruby Dir.foreach 缺少文件/File.exists?对于现有文件返回 false

2023-12-30

当我使用ruby打印出windows 7 system32目录中的所有文件时,有些文件丢失了。我使用这个简单的目录迭代:

Dir.foreach("C:\\Windows\\System32") do |fname|
  puts fname
end

我专门寻找 python27.dll,尽管它存在,但未打印。文件已存在?似乎与 dir 迭代有相同的问题。对于现有文件,它返回 false:

File.exists? "C:\\Windows\\System32\\python27.dll" #returns false

检查文件夹中的另一个现有文件是否有效:

File.exists? "C:\\Windows\\System32\\quartz.dll" #returns true

但如果我复制现有文件或在 system32 中创建新文件,则它不起作用

File.exists? "C:\\Windows\\System32\\quartz2.dll" #returns false

另外,将 python27.dll 复制到另一个目录并检查是否存在:

File.exists? "C:\\Otherfolder\\python27.dll" #returns true

该问题与字母大小写或路径分隔符无关。我查了一下。另外,我没有看到有效和无效文件的用户权限差异......

我真的不知道为什么会发生这种情况...任何人都可以重现这个吗???

thanks

[edit]

花了一段时间,但我找到了答案。

这是一个 32/64 位问题。对于 Ruby 作为 32 位应用程序,“C:\Windows\System32”实际上是“C:\Windows\SysWOW64”。正如 64 位 WinExplorer 所示,python27.dll 位于 System32 中(只有 64 位进程才能看到 - 嗯,令人困惑),而它应该位于 SysWOW64 中,以便 ruby​​ 看到。安装 32 位版本的 Python 解决了我的问题(因为我无法更改 ruby​​ 脚本,因为它是 ruby​​python 的一部分)。


在 Windows 7(实际上是 Vista)中,早期版本的 Windows 中仅存在于纸面上的许多安全策略现在实际上由操作系统强制执行。例如,根据微软的文档,写入到C:\Windows\System32几十年来,但如果你真的尝试过,它仍然有效。不再。从维斯塔开始,C:\Windows\System32是禁区。

然而,为了不破坏现有的(损坏的)应用程序,微软引入了文件系统虚拟化。如果应用程序尝试写入C:\Windows\System32,它会默默地重定向到C:\Users\%Username%\AppData\Local\VirtualStore\Windows\System32。因此,这个特定的应用程序可以看到它创建或更改的所有文件C:\Windows\System32, but other应用程序只能看到未更改的/空目录。

这不仅仅适用于C:\Windows\System32还可以访问其他系统目录。此外,它还适用于注册表的系统部分,例如HKEY_LOCAL_MACHINE例如。

这种虚拟化是针对每个应用程序的。 IE。如果应用程序 A 尝试在受保护的目录中创建或修改文件,Windows 将拦截该调用并将其重定向到 VirtualStore。它还会在某处记录此重定向。现在,当同一个应用程序 A 尝试再次查看那里时,Windows 将使用记录的重定向,以便该应用程序thinks文件就在它放置的地方,而事实上,它完全在其他地方。

然而,如果一个不同的应用程序 B 查看该目录,然后不会触发重定向,B 只会看到原始的系统目录。这就是重点:在过去,不同的应用程序会通过覆盖系统目录中彼此的文件来创建各种奇怪的错误。 IE。一个应用程序会转储其python27.dll into C:\Windows\System32另一个应用程序会转储its自己的,略有不同的不兼容版本python27.dll,覆盖第一个。

所以,你用过one应用程序将 DLL 复制到那里(可能是explorer.exe)并且你使用不同的应用程序,即ruby.exe看看它。但explorer.exe没有actually将其复制到system32,它被重定向到 VirtualStore。当你使用explorer.exe,重定向被触发,您会在您所在的位置看到该文件think你把它放了,但是当你使用时ruby.exe,重定向确实not被触发,它会看到目录的实际情况。

I bet that

File.exists? "C:/Users/#{ENV['Username']}/AppData/Local/VirtualStore/Windows/System32/python27.dll"

returns true.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System32 中的 Ruby Dir.foreach 缺少文件/File.exists?对于现有文件返回 false 的相关文章

  • 回形针如何更改基本名称(文件名)?

    我正在尝试更改照片的基本名称 文件名 在我的模型中我有 attr accessor image url basename has attached file image styles gt original gt 300x250 gt pn
  • BigDecimal 无法强制转换为 BigDecimal

    这应该很简单 但它却爆炸了 有任何想法吗 d BigDecimal new 2 0 YAML load a gt d to yaml TypeError BigDecimal can t be coerced into BigDecimal
  • RabbitMq 和“致命错误:握手失败 -handshake_decode_error”

    我正在使用 Windows Server 2012 Erlang 19 2 和 RabbitMq 3 6 6 我在使用 TLS 配置端点之间的连接时遇到问题 我已经尝试了所有关于 SO 的答案 以及所有 RabbitMq 文档here ht
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • 如何从数组中删除空白元素?

    我有以下数组 cities Kathmandu Pokhara Dharan Butwal 我想从数组中删除空白元素并想要以下结果 cities Kathmandu Pokhara Dharan Butwal 有没有类似的方法compact
  • Python 无法在 git bash 命令行中工作

    Python 不会在 git bash Windows 中运行 当我在命令行中输入 python 时 它会将我带到一个空行 而不会像在 Powershell 中一样显示它已输入 python 2 7 10 它没有给我错误消息 但 pytho
  • 如何使用 Ruby 2.7.0 修复 Rails 的警告消息

    有没有人解决这个问题Ruby 2 7 0 I used rbenv并安装了 Ruby v2 7 0 然后使用创建了一个 Rails 项目Rails v6 0 2 1 目前 通过运行之一 rails s rails s u puma rail
  • 无需别名的 Ruby YAML 编写

    我正在从 ruby 将数据写入 yaml 文件 并且经常在该文件上添加别名 像 id001 somekey somevalue id001 就我而言 我使用 yaml 文件来aid可读性并将名称添加到文件中的值 因为现有数据只是 没有键的分
  • 在OpenCV中将YUV转换为BGR或RGB

    我有一个电视采集卡 其输入内容为 YUV 格式 我在这里看到了与此问题类似的其他帖子 并尝试尝试所述的所有可能的方法 但它们都没有提供清晰的图像 目前最好的结果是 OpenCVcvCvtColor scr dst CV YUV2BGR 函数
  • Windows 上的 Openssl 错误 0x02001005 和 0x2006D002?

    我正在尝试使用 openssl 将 cer 证书转换为 p12 证书 这是我正在使用的命令 C OpenSSL Win32 bin gt openssl x509 inform der in developer identity cer o
  • Capybara 的 has_selector 有哪些选项?

    我在 RSpec 中遇到此错误 有没有任何文档have selector解释了选项哈希中的每个键以及它到底有什么作用 invalid keys content should be one of text visible between co
  • 更改 mingw' 启动目录或创建 mingw 符号链接

    设置 mingw 控制台启动目录的最简单方法是什么 我只使用 mingw 进行编译 但由于缺乏编辑器甚至符号链接 我很困惑如何告诉 mingw 控制台出现在不同的目录而不是常规的主目录中 如果有人知道如何像 cygwin 那样将 真正的 符
  • 使用 YAML.load 解析 json 安全吗?

    我使用的是红宝石2 1 0 我有一个 json 文件 例如 测试 json item apple 1 banana 2 使用 YAML load 加载此文件是否安全 YAML load File read test json 我正在尝试加载
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • 设置 Form.KeyPreview = true 的缺点?

    我想知道 Form KeyPreview 属性实际上有什么用处 它为什么存在以及将其设置为 true 会带来什么 风险 我想它一定有some负面影响 否则它根本不应该存在 或者至少默认情况下是正确的 EDIT 我很清楚what确实如此 我问
  • 什么是 - 获取的是一个目录 - 错误消息

    我收到这个奇怪的错误 Users gideon Documents ca ruby rubytactoe lib player rb 13 in gets Is a directory spec Errno EISDIR 玩家规格 rb r
  • Git 扩展 - 无法在 Windows 上推送到网络驱动器中的 git bare 存储库

    我正在 Windows 上学习 git 我已经安装了 Git 扩展 版本 2 47 3 并使用了它 我在我的 C 单元中创建了一个裸存储库 作为中央存储库 并在硬盘中的其他任何位置创建了个人存储库 我对硬盘中的这两个存储库进行提交 推送和拉
  • 如何使用命令行压缩文件?

    我想使用批处理文件命令 Windows XP 批处理文件 压缩目录 例如 如果我想解压缩一个文件意味着我可以使用jar xf file zip java bat 文件命令 就像我想要一个命令行批处理来压缩目录一样 如果您使用的是 Ubunt
  • 在 Cygwin 软件包列表中找不到 Openssl

    这里说的是https github com joyent node wiki Building node js on Cygwin Windows https github com joyent node wiki Building nod
  • 下载所有 gems 依赖项

    我想通过下载任何所需的文件并将它们带到另一台计算机来安装指南针没有互联网连接 我已经下载了指南针的源包 当我在未连接的计算机上运行 gem 时 它抱怨缺少依赖项 有什么解决办法吗 这正是我遇到的问题 经过一段时间的搜索后 我找到了一个可以使

随机推荐