我有带 FAT32 和 NTFS 分区的 HDD(比如 1TB),我不知道上面存储了哪些文件,但在需要时我想快速访问大文件,比如超过 500 MB。我不想扫描我的整个硬盘,因为它非常耗时。 我需要快速的结果。我想知道是否有任何我可以直接调用的 NTFS/FAT32 API - 我的意思是如果它们有一些关于存储文件的元数据那么它会更快。我想用 C++ 和 C# 编写我的程序。
编辑 如果扫描 HDD 是唯一的选择,那么我能做些什么来确保最佳性能。比如 - 我可以跳过扫描系统文件夹,因为我只对用户数据感兴趣。
最佳答案
如果您愿意自己做一些很多的额外工作来加快速度,您也许能够完成一些事情。很大程度上取决于您的需求。
让我们从 FAT32 开始。 FAT(通常,不仅仅是 32 位变体)以文件分配表命名。这是分区开头的一个数据 block ,它告诉分区中的哪些簇属于哪些文件。 FAT 基本上被组织为簇的链表。如果您只想找到大文件的数据区域,您可以将 FAT 读取为多个原始扇区,然后扫描该数据以找到超过 X 个簇的链表(其中X 定义了您认为是大文件的下限)。然后您可以访问这些集群并查看与每个文件关联的实际数据。奇怪的是,您不会知道的是该文件的名称。文件名包含在目录中,目录基本上类似于文件,只是它们包含的是指定格式的固定大小的记录。您必须从根目录开始,通读目录树以查找文件名。
NTFS 既简单又复杂。 NTFS 有一个主文件表 (MFT),用于包含分区中所有文件的记录。好处是您可以读取 MFT 并获取有关磁盘上每个文件的信息,而无需通过目录树来获取它。坏处是解码 NTFS 分区的内容绝对不是一件容易的事。 (有意义地)读取数据非常困难——写入数据更困难得多。此外,最新版本的 Windows 对从磁盘分区进行原始读取增加了更多限制,因此根据您访问的分区,您可能根本无法访问所需的数据。
但是,所有这些都只是最低限度的支持。为此,您打开一个名为“\.\D:”的文件(其中 D=您关心的磁盘的字母)。然后您可以从该磁盘驱动器读取原始扇区(假设打开它有效)。这将让您看到整个磁盘(或分区,视情况而定)的原始数据,从引导扇区开始,然后遍历那里的所有其他内容(FAT、根目录、子目录等——全部作为扇区原始数据)。系统会让你读取原始数据,但理解这些数据的所有工作都是你 100% 的责任。如果您所询问的速度是绝对必要的,那么这可能是可能的——但对于 FAT 卷来说,这将需要相当多的工作,并且比 NTFS 需要更多的工作。除非你真的像你说的那样需要额外的速度,否则可能不值得考虑尝试这样做。
关于c# - 用于查询大文件的 Windows 文件系统 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5919020/
我有一个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看起来疯狂不安全。所以,功能正常,
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
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
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在寻找执行以下操作的正确语法(在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