es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Calculando el tamaño de la carpeta / Enumerar el sistema de archivos.

Estoy intentando calcular el tamaño de una carpeta, pero el problema es que funciona rápido para la unidad D:\ u otras carpetas, pero cuando trato de hacer clic en la unidad C:\, la aplicación se congela durante unos 7-8 segundos. (Mi lista de unidades está en un treeview). Cuando quito el cálculo del tamaño de la carpeta, todo está bien. ¿Tienen alguna idea sobre esto?

   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;
        }
    }
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en el método GetDirectorySize(). Está tardando mucho en calcular el tamaño de la unidad C:\ debido a que es una unidad de sistema con una gran cantidad de archivos y carpetas. El método está realizando una enumeración recursiva a través de todos los subdirectorios y archivos en la unidad, lo cual lleva mucho tiempo.

    Una solución podría ser agregar una verificación para omitir archivos y carpetas ocultos y de sistema ya que pueden no ser necesarios para el cálculo del tamaño de la carpeta. Esto se puede implementar con el enum FileAttributes.

    Otro enfoque es utilizar una implementación de múltiples hilos para calcular el tamaño de la carpeta, lo que puede reducir significativamente el tiempo necesario para la operación. El método Parallel.ForEach() en C# se puede usar para lograr esto, donde cada subdirectorio y sus archivos se procesan en un hilo separado.

Comments are closed.