private long yy=0;
private void CopyAll(DirectoryInfo source,DirectoryInfo target )
{
if (Directory.Exists(target.FullName) == false)
{
try
{
Directory.CreateDirectory(target.FullName);
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
}
foreach (FileInfo fi in source.GetFiles())
{
yy += fi.Length;
backgroundWorker1.ReportProgress((int)yy / 1024);
}
foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
{
DirectoryInfo nextTargetSubDir =
target.CreateSubdirectory(diSourceSubDir.Name);
CopyAll(diSourceSubDir, nextTargetSubDir);
}
当我这样做时,我得到的结果是负数和错误的数值,之前已经得到了回答,有没有人知道我做错了什么?
答案 0 :(得分:1)
正如其他人所说的那样。什么是“yy”?它是整数吗?好久不过?一个字节?单身?一双?一个字符串?没人知道。 yy被神秘所包围。我认为对于总文件大小,yy是一个“长”,这可能是最安全的方式(虽然仍然容易出问题)。我也会忽略您的变量名称不匹配,以帮助解决您的问题。
在我们离开之前阅读材料:https://en.wikipedia.org/wiki/Integer_overflow
yy我假设你是源目录文件的总文件大小。当yy达到[数据类型] .MaxValue指定的最大值时,它会在有符号的值中越过它,它将从[datatype] .MinValue中留下什么。在每次迭代中断,yy被添加到并添加一个监视“yy”。您将看到它的值缓慢(或快速,取决于目录中文件的大小)达到[datatype] .MaxValue。达到此值并不断添加到它将返回MinValue。
对于某些互动学习,请试用这段代码:
long val = long.MaxValue;
val += 1;
检查val,你会看到它是-9223372036854775808。 (参见以前的轻度学习材料)
你的问题必须是“我在这里取得的成就”。您是否必须知道所有文件的总大小,或者您可以以不同方式实现它。实现超大尺寸值的常用方法是在其自己的数据存储中保持对每个单元的引用。按单位我的意思是单位,数十,数百,数千等等,并添加你的single.Length到这。你必须自己写这个。
你可以使用浮点数来增加数量,但这完全取决于你需要读数的准确程度。 (随着数量变大,浮点数会丢失精度)
编辑:再次查看代码后还要考虑另一点。您正在将yy转换为报表进度中的int。如果yy很长并且当yy大于int.MaxValue时转换为int,您将看到相同的问题。你为什么要把yy转换为int?为什么不直接在yy上除以1024,然后转换为int(仍然假设yy是长的)
(int)(yy / 1024)
编辑2:按照详细说明的代码,您正在通过文件夹递归,几乎绝对会在您的yy值上达到MaxValue。
编辑3:为什么在编写看似“复制”方法的所有文件的总大小时要复制整个目录结构。 (请注意,您在目标目录中创建目录但不复制任何文件,因此它似乎是目录结构副本而不是数据)如果您想要做某种“目的地是否有足够的空间来执行此复制”你应该在目的地之前做任何事情之前计算空间。
祝你好运!答案 1 :(得分:0)
的数据类型
Directory.GetFiles()
会为您提供一个字符串列表。 你无法直接将其转换为FileInfo
这里的问题。FileInfo.Length
将返回bytes
中文件的大小,因此如果文件大小很大,则整数范围不足以保存该值。所以检查yy
所以我建议你做以下的事情:
foreach (string F in Directory.GetFiles("D:\YourDirectory"))
{
FileInfo tempFileInfo = new FileInfo(F);
yy += tempFileInfo.Length;
backgroundWorker1.ReportProgress((int)yy / 1024);
}