2017-07-31 2 views
0

Lorsque je supprime un dossier à l'aideSuppression de dossiers remplis de fichiers ne libère pas l'espace immédiatement

DirectoryInfo.Delete(true) 

la valeur pour

DriveInfo.AvailableFreeSpace 

reste à peu près le même. Par exemple, lorsque je supprime des dossiers dans une boucle tout en vérifiant availablefreespace je finis par supprimer des gigaoctets et gigaoctets de données alors qu'il aurait dû supprimer moins d'un gigaoctet.

//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); 

} 

Est-ce qu'il y en avait autour de ça en utilisant C# et dotnetcore?

+0

Cela va utiliser les mathématiques entier afin qu'il il sera soit 100 ou 0. –

+0

@mwwhited Pouvez-vous expliquer cela? Je ne comprends pas comment '(secondaryDrive.TotalSize - secondaryDrive.AvailableFreeSpace)/secondaryDrive.TotalSize * 100' serait contraint à 0 ou 100. – Theyouthis

+0

Ces valeurs sont toutes des valeurs entières (vraiment long ... mais la même idée). En tant que tels, ils n'auront aucune valeur décimale. penser à '(100-90)/100'. Cela équivaudrait '.9' mais étant des valeurs interger le plus grand entier est' 0' –

Répondre

2

Toutes les valeurs d'entrée que vous vérifiez sont des types entiers. Les nombres entiers ne comprennent pas les parties décimales d'un nombre.

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