【问题标题】:Is there a O(1) way in windows api to concatenate 2 files?Windows api中是否有O(1)方式来连接2个文件?
【发布时间】:2009-01-11 07:40:27
【问题描述】:

Windows API 中是否有 O(1) 的方式来连接 2 个文件?

O(1) 相对于不必读取整个第二个文件并将其写出到要附加到的文件中。因此,与处理的 O(n) 字节相反。

我认为这在文件系统驱动程序级别应该是可能的,而且我认为没有可用的用户模式 ​​API,但我想我会问。

【问题讨论】:

  • 我认为你问错了问题。 O(1) 关于什么?
  • 更新得更清楚了。

标签: c++ winapi visual-c++


【解决方案1】:

如果“新文件”只会被您的应用程序读取,那么您无需在磁盘上实际连接它们即可逃脱。

您可以只实现一个流接口,其行为就像两个文件已连接一样,然后使用该流,而不是您的应用框架使用的默认文件流实现。

如果这对您不起作用,并且您使用的是 Windows,您总是可以创建一个重新解析点和一个文件系统过滤器。我相信如果您创建一个“迷你过滤器”,它将在用户模式下运行,但我不确定。

您可能可以在此处找到有关它的更多信息:

http://www.microsoft.com/whdc/driver/filterdrv/default.mspx

【讨论】:

  • 根据您的情况,编写自己的微型过滤器来解决此问题可能是多余的,特别是考虑到它需要至少一个内核模式组件。 Scott 的其他建议(实现流接口)肯定会少很多工作。
【解决方案2】:

不,没有。

您可能希望的最好结果是 O(n),其中 n 是两个文件中较短的文件的长度。

【讨论】:

  • 两个文件中较短的 n 与 Big-Oh 分析有什么关系?
  • 它没有。在 Windows 中连接文件的时间与第二个文件的大小成线性关系,您需要将这个文件塞到第一个文件的末尾。
  • 我认为您可以使用用户模式文件系统过滤器(所谓的“迷你过滤器”)来做到这一点,它将获取 2 个文件并将它们视为一个
  • 当然你可以在驱动程序级别。
  • BobbyShaftoe:从多个参数的角度分析事物本质上并没有错——这只是你想给出多少细节的问题。替换为“O(min(n, m)),其中 n 和 m 是文件的长度”,如果它能让你感觉更好。
【解决方案3】:

从理论上讲,这是可能的(在磁盘上),前提是:

  • 第二个文件被销毁
  • 连接遵循文件系统的片段对齐方式(例如,发生在集群边界上)

【讨论】:

  • 我知道在磁盘上这是可能的,只是不知道如果没有低级驱动程序是否可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2015-06-20
  • 2010-10-20
相关资源
最近更新 更多