如何在循环中检查目录中的所有文件大小
本文关键字:文件大小 检查 循环 | 更新日期: 2023-09-27 18:26:46
s = Environment.GetEnvironmentVariable("UserProfile") + "''Pictures";
string[] photosfiles = Directory.GetFiles(t, "*.*", SearchOption.AllDirectories);
for (int i = 0; i < s.Length; i++)
{
File.Copy(photosfiles[i], tempphotos + "''" + Path.GetFileName(photosfiles[i]), true);
}
这会将文件从一个目录复制到另一个目录。我想在 FOR 循环内检查目标目录大小。例如,首先复制一个文件以检查文件大小,如果小于50mb继续。
复制第二个文件后循环中的下一个迭代,如果两个文件大小都小于 50mb,请检查目标目录大小中的两个文件,请继续。依此类推,直到达到 50mb,然后停止循环。
您可以在开始复制文件之前计算目录的大小,然后在复制时添加每个文件的大小,也可以在每次文件复制后重新计算目录的大小。我认为后一种选择可能会更准确,但效率也会低得多,具体取决于您要复制的文件的大小(如果它们非常小,您最终会将它们全部计数很多次(。
要获取目录的大小,请使用:
public static long DirSize(DirectoryInfo d)
{
long Size = 0;
// Add file sizes.
FileInfo[] fis = d.GetFiles();
foreach (FileInfo fi in fis)
{
Size += fi.Length;
}
// Add subdirectory sizes.
DirectoryInfo[] dis = d.GetDirectories();
foreach (DirectoryInfo di in dis)
{
Size += DirSize(di);
}
return(Size);
}
此处用作示例的函数:http://msdn.microsoft.com/en-us/library/system.io.directory(v=vs.100(.aspx
因此,您的代码将如下所示:
for (int i = 0; i < photosfiles.Length; i++)
{
FileInfo fi(photosfiles[i]);
DirectoryInfo d = new DirectoryInfo(tempphotos);
long dirSize = DirSize(d);
//if copying the file would take the directory over 50MB then don't do it
if ((dirSize + fi.length) <= 52428800)
fi.CopyTo(tempphotos + "''" + fi.Name)
else
break;
}
您可以借助以下代码段:
string[] sizes = { "B", "KB", "MB", "GB" };
double len = new FileInfo(filename).Length;
int order = 0;
while (len >= 1024 && order + 1 < sizes.Length) {
order++;
len = len/1024;
}
// Adjust the format string to your preferences. For example "{0:0.#}{1}" would
// show a single decimal place, and no space.
string result = String.Format("{0:0.##} {1}", len, sizes[order]);
或
static String BytesToString(long byteCount)
{
string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; //Longs run out around EB
if (byteCount == 0)
return "0" + suf[0];
long bytes = Math.Abs(byteCount);
int place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024)));
double num = Math.Round(bytes / Math.Pow(1024, place), 1);
return (Math.Sign(byteCount) * num).ToString() + suf[place];
}
两个答案都来自链接如何使用 .NET 获得人类可读的文件大小(以字节缩写为单位(?