【问题标题】:Bypassing Windows Copy design绕过 Windows 复制设计
【发布时间】:2010-12-25 07:08:32
【问题描述】:

我一直在尝试找出一种方法来简化将文件从一个驱动器(在我的情况下是网络或外部)复制到我的主系统驱动器的过程。除了创建一个我每次都必须激活的程序然后选择其中的所有信息之外,我没有真正好的设计来绕过它。

我一直想知道是否有一种方法可以通过程序来截取直接的 Windows 副本以按照我的方式进行操作。基本设计是,在抓取副本时(实际上,为了提高效率,一组不同的副本),程序会将所有单独的副本组织成一个副本流。

我一直想这样做,因为最近我需要备份大量数据并进行大量移动,因为过去几个月我的所有驱动器似乎都出现故障。

编辑

目前,假设我正在从完全碎片整理的外部驱动器复制(因为我是)。我们还假设我正在复制到 99% 的碎片整理驱动器(因为我是)。如果我尝试一次移动每个文件,那么 Windows 复制方法效果很好,因为它只需要将一个连续文件从一个驱动器流式传输到另一个驱动器(可能保持副本连续)。这基本上是最好的情况,我需要从那里移动到这里的所有东西。因此,复制方法会以某种算法逻辑顺序(通常按文件名)获取文件,然后读取数据,然后将数据写入新位置。

现在针对实际情况,我改为将一堆文件从不同位置(我们仍然假设完全碎片整理,因为这是我的外部的情况)复制到第二个驱动器上的不同文件位置。我不希望在开始下一个之前等待每个完成,所以我通过文件夹挑选并选择去哪里,很快我的屏幕被复制窗口覆盖,显示所有尝试运行的副本的状态同时。由于每个副本独立于其他副本进行,因此整个副本的速度会略有下降。这意味着不是单个连续文件占用可用的总带宽,而是所有这些文件大致相等地共享带宽(这也增加了磁盘的读写延迟,因为现在系统必须在循环返回之前从每个文件中获取一点到第一个)。仍然假设最好的情况,这比所有文件都在一个位置并移动到一个位置要慢。

我想做的是拦截所有单独的下载并将它们组织成一个单独的下载列表,这些下载会一个接一个地发生。

【问题讨论】:

  • “抢副本”是什么意思?
  • 你想实现自己的文件复制功能,然后hook标准的Windows复制过程,改用自己的代码? 为什么? 编写比 Windows Shell 团队更好的文件复制算法的可能性非常低。他们已经有一段时间了......
  • 在 SO 上寻求帮助的人似乎不太可能比 Windows Shell 团队做得更好!
  • 有很多不同的复制场景,Windows shell 优化的场景可能对 OP 的情况特别不利。例如,他可能将单个源复制到多个目标,这在 Explorer 中很难做到最佳。

标签: c# copy system


【解决方案1】:

您可以很好地拦截的唯一方法是 FileSystemWatcher。

【讨论】:

  • 我不确定这对我有什么帮助。我以前用过,但只有一点点。如果我附加到文件创建事件,那会让我知道文件来自哪里,因为这是我可以尝试绕过 Windows 副本然后尝试自己复制它的唯一方法。这也可能会出现这样一个问题,即如果我确实将几个文件从一个位置复制到同一个新位置,程序将不会意识到这一点,因为每个文件都不会立即创建,而是仅在其读取开始时创建。
【解决方案2】:

这可能就是你要找的东西

detect Windows Explorer copy operation

你需要根据这篇文章创建一个Shell Extension。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 2021-01-05
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多