Quiero establecer un límite de caché para mi programa C #. Mi programa crea archivos periódicamente y los guarda en una carpeta. Lo quiero, así que si la carpeta (C: \ SysApp) alcanza este límite (150000KB), automáticamente comenzará a eliminar los archivos comenzando con los más antiguos, eliminando solo una cierta cantidad a la vez (149900KB).

Hasta ahora tengo este código:

private void DeleteOldFilesIfOverFolderLimit(string folderPath,
                                             long folderSizeLimit,
                                             long amountToDelete)
{
    var folder = new DirectoryInfo(folderPath);
    var files = folder.GetFiles();
    var folderSize = files.Sum(fi => fi.Length);

    if (folderSize > folderSizeLimit)
    {
        // Sort the list of files with the oldest first.
        Array.Sort(files,
                   (fi1, fi2) => fi1.CreationTime.CompareTo(fi2.CreationTime));

        var amountDeleted = 0L;

        foreach (var file in files)
        {
            amountDeleted += file.Length;
            file.Delete();

            if (amountDeleted >= amountToDelete)
            {
                break;
            }

        }
    }
}

Solo estoy tratando de averiguar dónde necesito insertar los datos específicos para mi programa (que figuran en el primer párrafo entre paréntesis).

Estoy usando Visual Studio Community 2015.

-3
Theresa.Eckert 15 dic. 2016 a las 22:05

2 respuestas

La mejor respuesta

Haga clic en las opciones del proyecto y seleccione la configuración:

pic

Ingrese los valores predeterminados

pic

Y su programa puede leer estos valores (del archivo .settings o los valores predeterminados) usando el siguiente código

static void Main(string[] args)
{
    string folder=Properties.Settings.Default.folder;
    long limit=Properties.Settings.Default.sizeLimit;
    long delete=Properties.Settings.Default.toDelete;
}

Si cambia el valor de configuración en el programa, debe guardar los nuevos valores antes de salir de la aplicación. Esto se hace con Properties.Settings.Default.Save();. Este comando crea un archivo .config con sus valores. Estos se leen automáticamente cuando se inicia el programa.

El contenido es un archivo XML con los valores de configuración claramente visibles.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="SO_KeepStettings.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <SO_KeepStettings.Properties.Settings>
            <setting name="folder" serializeAs="String">
                <value>C:\SysApp</value>
            </setting>
            <setting name="sizeLimit" serializeAs="String">
                <value>157286400</value>
            </setting>
            <setting name="toDelete" serializeAs="String">
                <value>156237824</value>
            </setting>
        </SO_KeepStettings.Properties.Settings>
    </userSettings>
</configuration>
1
John Alexiou 15 dic. 2016 a las 20:12

Eliminar archivos es incompleto, si accidentalmente pasa una cadena mal formada o simplemente la cadena incorrecta, entonces perderá datos, como eliminar accidentalmente su única copia de su tesis doctoral o destruir su sistema operativo. Entonces, solo le mostraré cómo llamar a un método en lugar de mostrarle cómo usar este código que le dieron:

Comenzando con un ejemplo de ¡Hola, mundo! :

public class Hello1
{
    public static void Main()
    {
        System.Console.WriteLine("Hello, World!");

        // This is here only to pause the console window so it stays open.
        System.Console.ReadLine();
    }
}

Ahora implementemos nuestro propio método para imprimir cualquier cadena en la consola:

public class Hello1
{
    public static void Main()
    {
        PrintToConsole("Hello World!");

        // This is here only to pause the console window so it stays open.
        System.Console.ReadLine();
    }

    private static void PrintToConsole(string stringToPrintToConsole)
    {
        System.Console.WriteLine(stringToPrintToConsole);
    }
}

Por último, pasemos otro parámetro para controlar cuántas veces se imprime la línea:

public class Hello1
{
    public static void Main()
    {
        PrintToConsole("Hello World!", 5);

        // This is here only to pause the console window so it stays open.
        System.Console.ReadLine();
    }

    private static void PrintToConsole(string stringToPrintToConsole, long numberOfTimesToPrint)
    {
        for (int i = 0; i < numberOfTimesToPrint; i++)
        {
            System.Console.WriteLine(stringToPrintToConsole);
        }
    }
}

Se le dio un método, pero no dónde está llamando a ese método. Observe cómo en mi programa tengo que llamar a PrintToConsole() en algún lugar, y al ser una aplicación de consola, el programa completo comienza y termina en Main(), así que ahí es donde pongo el código. Técnicamente, podría tomar el cuerpo de su método y pegarlo directamente en Main, luego, dondequiera que vea el uso de la variable folderPath, lo reemplace con la cadena real "C:\\SysApp" e igualmente con los otros 2 parámetros y el programa funcionaría igual.

1
Quantic 15 dic. 2016 a las 19:44