当我使用 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
问题与字母大小写或路径定界符无关。我查过了。此外,我没有看到有效文件和无效文件的用户权限差异......
我真的不知道,为什么会这样......任何人都可以重现这个吗???
谢谢
[编辑]
花了一段时间,但我找到了答案。
这是一个 32/64 位问题。对于作为 32 位应用程序的 ruby,“C:\Windows\System32”实际上是“C:\Windows\SysWOW64”。正如 64 位 WinExplorer 显示的那样,python27.dll 在 System32 中(只有 64 位进程可以看到 - 好吧,令人困惑),而它应该在 SysWOW64 中让 ruby 看到。安装 32 位版本的 Python 解决了我的问题(因为我无法更改 ruby 脚本,因为它是 rubypython 的一部分)。
最佳答案
在 Windows 7(实际上是 Vista)中,许多在早期版本的 Windows 中只存在于纸面上的安全策略现在实际上由操作系统强制执行。例如,根据 Microsoft 的文档,几十年来写入 C:\Windows\System32 几乎是非法的,但如果您实际尝试过,它仍然有效。不再。从 Vista 开始,C:\Windows\System32 是禁止访问的。
但是,为了不破坏现有(损坏的)应用程序,Microsoft 引入了文件系统虚拟化。如果应用程序尝试写入 C:\Windows\System32,它会被静默重定向到 C:\Users\%Username%\AppData\Local\VirtualStore\Windows\System32 >。因此,此特定应用程序会看到它在 C:\Windows\System32 中创建或更改的所有文件,但其他应用程序只能看到未更改/空目录。
这不仅适用于 C:\Windows\System32,也适用于其他系统目录。此外,它还适用于注册表的系统部分,例如 HKEY_LOCAL_MACHINE。
这种虚拟化是针对每个应用程序的。 IE。如果应用程序 A 试图在 protected 目录中创建或修改文件,Windows 将拦截该调用并将其重定向到 VirtualStore。它还会在某处记录此重定向。现在,当同一个应用程序 A 试图再次查看那里时,Windows 将使用记录的重定向,以便应用程序认为文件在它放置它的位置,而实际上,它完全在其他地方。
但是,如果不同应用程序 B 查看该目录,则不会触发重定向,B 只会看到原始系统目录。这就是重点:在过去,不同的应用程序会通过覆盖系统目录中彼此的文件来创建各种奇怪的错误。 IE。一个应用程序会将其 python27.dll 转储到 C:\Windows\System32 中,而另一个应用程序会转储它的自己的、略有不同的不兼容版本的 python27.dll,覆盖第一个
因此,您使用一个应用程序将 DLL 复制到那里(可能是 explorer.exe),然后您使用了一个不同应用程序,即 ruby.exe 看看吧。但是 explorer.exe 并没有实际上 将它复制到 system32 中,它被重定向到 VirtualStore。当您使用 explorer.exe 时,会触发重定向,您会在认为放置它的位置看到文件,但是当您使用 ruby.exe,重定向不会被触发,它会看到目录的实际情况。
我打赌
File.exists? "C:/Users/#{ENV['Username']}/AppData/Local/VirtualStore/Windows/System32/python27.dll"
返回 true。
关于System32 中的 Ruby Dir.foreach 是否缺少文件/File.exists?对现有文件返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12122263/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex