gpt4 book ai didi

.net - 智能文件复制算法(与OS无关)

转载 作者:行者123 更新时间:2023-12-04 17:25:45 25 4
gpt4 key购买 nike

我正在尝试创建一种快速且有些智能的文件复制算法(在C#中,但与平台无关)。

我的目标:


我不想使用任何平台特定的代码(无密码或其他任何东西)
我想利用多个内核,但这似乎很愚蠢,因为同时进行读/写操作会比较慢,对吗? (如果我错了请指正)
我想跟踪复制进度,因此不能选择File.Copy


我提出的代码没什么特别的,我正在研究加速的方法:

public bool Copy(string sourcePath, string destinationPath, ref long copiedSize, long totalSize, int fileNum, int fileCount, CopyProgressCallback progressCallback)
{
FileStream source = File.OpenRead(sourcePath);
FileStream dest = File.Open(destinationPath, FileMode.Create);

int size = (int)(1024 * 256); // 256KB
int read = 0;

byte[] buffer = new byte[size];

try
{
while ((read = source.Read(buffer, 0, size)) != 0)
{
dest.Write(buffer, 0, read);

copiedSize += read;
progressCallback(copiedSize, totalSize, fileNum, fileCount, j);
}

return true;
}
catch
{
// No I don't care about exception reporting.
return false;
}
finally
{
source.Close();
dest.Close();
}
}


我尝试过但无法解决的问题:


不断增加缓冲区(CD / DVD的速度损失和缓存问题)
尝试了“ CopyFileEx”-pinvokes正在减慢复制速度
尝试了许多不同的缓冲区大小,256KB似乎是最佳解决方案
尝试在撰写时阅读-慢下来
更改了'progressCallback'以在1秒后更新UI(使用Stopwatch类)-这显着提高了速度


欢迎提出任何建议-我将在尝试新内容时更新代码/内容。建议不
不必是代码-只是想法。

最佳答案

如果没有多个读/写头,那么多个核的使用就很少了,这可能意味着有多个磁盘。由于您的问题与平台无关,因此我建议您使用并行I / O系统,让所有这些内核分担工作而不是闲置。

如果将自己限制在具有单个读/写臂和每个表面一个磁头的单个磁盘上,则需要最大程度地减少臂的移动。您可能想要从一个表面上的轨道读取并写入另一表面上的同一轨道。或者,您可能想从一个表面读取一个扇区,然后复制到同一表面上同一轨道上的另一个扇区。

但是,所有这些都涉及非常低级的操作(在我看来,它们看起来非常低级)。通用计算的整体趋势似乎是不断为程序员提供易于使用的工具,但其代价是消除了对低级操作的便捷访问。您自己设置的任务大致如下:

诱使C#以我想要的方式(而不是以它想要的方式)访问磁盘。

祝你好运:-)

标记

PS:您对CD / DVD的提及表明,尽管您未作说明,但您尝试将其从磁盘快速复制到CD / DVD。如果是这样,您可能会考虑首先进行磁盘-磁盘复制,让复印机恢复工作,然后将复制副本复制到另一核上的CD / DVD。

关于.net - 智能文件复制算法(与OS无关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2064300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com