C# 删除充满文件的文件夹不会';我不能马上腾出空间

C# 删除充满文件的文件夹不会';我不能马上腾出空间,c#,ubuntu,ubuntu-14.04,.net-core,ubuntu-server,C#,Ubuntu,Ubuntu 14.04,.net Core,Ubuntu Server,当我使用删除文件夹时 DirectoryInfo.Delete(true) 价值 DriveInfo.AvailableFreeSpace 几乎保持不变。例如,当我在循环中删除文件夹时,同时检查availablefreespace我最终删除了千兆字节和千兆字节的数据,而这些数据本应删除不到千兆字节 //Delete in secondary storage string secondaryRoot = Path.GetPathRoot(settings.SecondaryFeatureExt

当我使用删除文件夹时

DirectoryInfo.Delete(true)
价值

DriveInfo.AvailableFreeSpace
几乎保持不变。例如,当我在循环中删除文件夹时,同时检查
availablefreespace
我最终删除了千兆字节和千兆字节的数据,而这些数据本应删除不到千兆字节

//Delete in secondary storage
string secondaryRoot = Path.GetPathRoot(settings.SecondaryFeatureExtractDirectory);
DriveInfo secondaryDrive = new DriveInfo(secondaryRoot);
DirectoryInfo secondaryInfo = new DirectoryInfo(settings.SecondaryFeatureExtractDirectory);
while ((secondaryDrive.TotalSize - secondaryDrive.AvailableFreeSpace) / secondaryDrive.TotalSize * 100 < settings.DriveFreePercentage)
{
    logger.LogInformation("checkForCleanup before delete: {@Freespace}", secondaryDrive.AvailableFreeSpace);
    secondaryThresholdPassed = true;
    DirectoryInfo oldestDir = secondaryInfo.EnumerateDirectories().OrderBy(x => x.LastWriteTimeUtc).FirstOrDefault();
    if (oldestDir == null) break;
    oldestDir.Delete(true);
    logger.LogDebug("checkForCleanup deleted: {@DirectoryName}", oldestDir.FullName);
    logger.LogInformation("checkForCleanup after delete: {@Freespace}", secondaryDrive.AvailableFreeSpace);
    Thread.Sleep(1);

}
//在辅助存储器中删除
字符串secondaryRoot=Path.GetPathRoot(settings.SecondaryFeatureExtractDirectory);
DriveInfo secondaryDrive=新的DriveInfo(secondaryRoot);
DirectoryInfo secondaryInfo=新目录信息(settings.SecondaryFeatureExtractDirectory);
而((secondaryDrive.TotalSize-secondaryDrive.AvailableFreeSpace)/secondaryDrive.TotalSize*100x.LastWriteTimeUtc).FirstOrDefault();
如果(oldestDir==null)中断;
oldestDir.Delete(true);
LogDebug(“checkForCleanup已删除:{@DirectoryName}”,oldestDir.FullName);
logger.LogInformation(“checkForCleanup-after-delete:{@Freespace}”,secondaryDrive.AvailableFreeSpace);
睡眠(1);
}

使用c#和dotnetcore是否存在任何问题?

您正在检查的所有输入值都是整数类型。整数数学不包括数字的小数部分

var di = //new DriveInfo("c");
    new
    {
        TotalSize = 255471906816L,
        AvailableFreeSpace = 125059747840L
    };

var ps = ((di.TotalSize - di.AvailableFreeSpace) / di.TotalSize) * 100;
Console.WriteLine(ps);  // 0
var ps2 = (int)((((double)di.TotalSize - di.AvailableFreeSpace) / di.TotalSize) * 100d);
Console.WriteLine(ps2);  // 51

您正在检查的所有输入值都是整数类型。整数数学不包括数字的小数部分

var di = //new DriveInfo("c");
    new
    {
        TotalSize = 255471906816L,
        AvailableFreeSpace = 125059747840L
    };

var ps = ((di.TotalSize - di.AvailableFreeSpace) / di.TotalSize) * 100;
Console.WriteLine(ps);  // 0
var ps2 = (int)((((double)di.TotalSize - di.AvailableFreeSpace) / di.TotalSize) * 100d);
Console.WriteLine(ps2);  // 51

这将使用整数数学,所以它将是100或0。@mwhited您能解释一下吗?我不明白
(secondaryDrive.TotalSize-secondaryDrive.AvailableFreeSpace)/secondaryDrive.TotalSize*100
将如何被限制为0或100。这些值都是整数值(非常长…但想法相同)。因此,它们不会有任何十进制值。想想
(100-90)/100
。这将等于
.9
但作为整数,最大的整数就是
0
,除非驱动器100%满了,否则结果总是
0
。现在感觉有点傻。正在验证这是否是修复。这将使用整数数学,因此它将是100或0。@mwhited您能解释一下吗?我不明白
(secondaryDrive.TotalSize-secondaryDrive.AvailableFreeSpace)/secondaryDrive.TotalSize*100
将如何被限制为0或100。这些值都是整数值(非常长…但想法相同)。因此,它们不会有任何十进制值。想想
(100-90)/100
。这将等于
.9
但作为整数,最大的整数就是
0
,除非驱动器100%满了,否则结果总是
0
。现在感觉有点傻。正在验证这是修复程序。