TL/DR:
我有两台机器:A和B。我制作了一个测试程序,来测试它们之间的介质(接口(interface)) - 我在将文件从A复制到B然后从B复制到A时检查错误,但我必须这样做这是我能做到的最快的。所以我有A源文件:SRC,然后将其复制到B到新文件:MID,然后我再次将MID从B复制到A到新文件DST,然后将SRC与DST进行比较。这里的问题是如何以尽可能高的速度(即并行)来做到这一点
详细说明:
如何在写入文件的同时复制文件?我用CopyFileEx将文件从 SRC 复制到 MID,同时我必须再次将其从 MID 复制到 DST。数据必须明确地通过磁盘,我不能使用内存缓冲区或缓存,并且:
- 必须在 MID 上创建文件时执行第二次复制 - 我等不及它完成复制。
- 我必须再次从 MID 显式读取文件 - 我无法使用用于从 SRC 复制到 MID 的缓冲区
- 所有这些都必须以我能做到的最快速度执行
我可以轻松处理同步问题(我使用 CopyFileEx 的 CopyProgressRoutine 回调来了解已完成多少字节并相应地触发事件),但文件在复制时被锁定以供读取。我无法使用普通的 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/