【发布时间】:2022-01-07 02:53:48
【问题描述】:
我正在尝试计算文件夹大小,但问题是;它在 D:\ 驱动器或其他文件夹中运行得很快,但是每当我尝试单击 C:\ 驱动器时,应用程序会冻结大约 7-8 秒。 (我的驱动器列表在树视图上) 当我删除文件夹大小时,一切正常。大家对此有什么想法吗?
public FolderModel(string folderPath)
{
try
{
//File = new FileInfo(folderPath);
//FolderInfo = new DirectoryInfo(folderPath);
//_createdTime = FolderInfo.CreationTime.ToShortDateString();
//_folderName = FolderInfo.Name;
//_folderPath = folderPath;
//Fileextension = File.Extension.ToLower();
//this.Children = new ObservableCollection<FolderModel>();
_folderSize = CalculatorSize(GetDirectorySize(folderPath));
}
catch (Exception e)
{
//
}
}
internal string CalculatorSize(long bytes)
{
var suffix = new[] { "B", "KB", "MB", "GB", "TB" };
float byteNumber = bytes;
for (var i = 0; i < suffix.Length; i++)
{
if (byteNumber < 1000)
{
if (i == 0)
return $"{byteNumber} {suffix[i]}";
else
return $"{byteNumber:0.#0} {suffix[i]}";
}
else
{
byteNumber /= 1024;
}
}
return $"{byteNumber:N} {suffix[suffix.Length - 1]}";
}
internal static long GetDirectorySize(string directoryPath)
{
try
{
if (Directory.Exists(directoryPath))
{
var d = new DirectoryInfo(directoryPath);
return d.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length);
}
return new FileInfo(directoryPath).Length;
}
catch (UnauthorizedAccessException)
{
return 0;
}
catch (FileNotFoundException)
{
return 0;
}
catch (DirectoryNotFoundException)
{
return 0;
}
}
【问题讨论】:
-
利用异步编程。即使您仍在忙于计算,这也会使 UI 响应。作为参考检查这个link
-
您只对驱动器感兴趣吗?您使用的是哪个 .NET 版本?
-
@BionicCode,我使用的是 .Net Framework 4.7.2 不,不仅是驱动器。我有包含桌面、文档、文件夹、目录、驱动器的树视图......但只有当我展开 C:\ 驱动器时它才会冻结。 7-8 秒后,它会扩展,当我扩展 childerens 时,它会再次冻结。
-
@Harish 谢谢,我试过了,但结果是一样的。或者也许我做不到。
标签: c# wpf directory size freeze