c# - 如何在文件写入时尽可能快地复制文件?

标签 c# winapi pinvoke memory-mapped-files volume-shadow-service

TL/DR:

我有两台机器:A和B。我制作了一个测试程序,来测试它们之间的介质(接口(interface)) - 我在将文件从A复制到B然后从B复制到A时检查错误,但我必须这样做这是我能做到的最快的。所以我有A源文件:SRC,然后将其复制到B到新文件:MID,然后我再次将MID从B复制到A到新文件DST,然后将SRC与DST进行比较。这里的问题是如何以尽可能高的速度(即并行)来做到这一点

详细说明:

如何在写入文件的同时复制文件?我用CopyFileEx将文件从 SRC 复制到 MID,同时我必须再次将其从 MID 复制到 DST。数据必须明确地通过磁盘,我不能使用内存缓冲区或缓存,并且:

  1. 必须在 MID 上创建文件时执行第二次复制 - 我等不及它完成复制。
  2. 我必须再次从 MID 显式读取文件 - 我无法使用用于从 SRC 复制到 MID 的缓冲区
  3. 所有这些都必须以我能做到的最快速度执行

我可以轻松处理同步问题(我使用 CopyFileExCopyProgressRoutine 回调来了解已完成多少字节并相应地触发事件),但文件在复制时被锁定以供读取。我无法使用普通的 C# FileStream - 速度太慢了...

我目前正在研究的可能解决方案:

  • 卷影复制(特别是 AlphaVSS )
  • memory-mapped-file - 我设法做得很快,但我担心系统实际上使用了缓存,并且没有真正从 MID 读回
  • 一些我不知道的 win-API P/Invoke 函数??

最佳答案

为了能够在写入文件时读取文件,必须使用 dwShareMode = FILE_SHARE_READ 创建该文件。您可能必须放弃 CopyFileEx 并使用 CreateFile/ReadFile/WriteFile 自行实现。对于异步读/写,您可以使用 ReadFile/WriteFile 函数的 lpOverlapped 参数。

关于c# - 如何在文件写入时尽可能快地复制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17418851/

相关文章:

c++ - 显示不同目录中文件的文件属性对话框

c# - 如何使用.net更改Windows2k8的时区设置

c# - 当我的类多次实现 IEnumerable<T> 时,为什么我不能使用 LINQ to Objects?

c# - 如何强制完成并行事件或工作流?

c# - 将任何日期时间值转换为 UTC

c# - P/Invoke 代码在 WinXP 上工作,在 Win2k8 上异常(exception)

c# - 平台 pinvoke 教程 msdn

c# - Visual Studio/MSBuild 将引用类库的 app.config 作为 *.dll.config 复制到当前项目的 bin 文件夹

windows - 工具提示文本被截断

winapi - 如何将 GDI+ 位图放入剪贴板?