2016-12-15 3 views
-3

Ich möchte ein Cache-Limit für mein C# -Programm festlegen. Mein Programm erstellt regelmäßig Dateien und speichert sie in einem Ordner. Ich will es so, wenn der Ordner (C: \ SysApp) dieses Limit (150000KB) erreicht, fängt es automatisch an, die Dateien zu löschen, beginnend mit den ältesten, die immer nur einen bestimmten Betrag löschen (149900KB).Wo füge ich diese Daten in meinen Code ein?

Bisher habe ich diesen Code:

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; 
      } 

     } 
    } 
} 

Ich versuche nur, um herauszufinden, wo ich die spezifischen Daten für mein Programm einfügen muß (in ersten Absatz in Klammern angegeben).

ich Visual Studio Gemeinschaft 2015

+0

Welchen Teil Ihres Codes verstehen Sie nicht? Sehen Sie sich die Funktionsparameter an. – SLaks

+1

Ich bin versucht, diese Frage zu verwerfen, weil es genau unklar ist, was Sie fragen. Die Antwort kann nicht so einfach sein wie "gib sie in die klar benannten Parameter in deiner Funktion", oder? – BradleyDotNET

+0

Wenn es konfigurierbar ist, legen Sie es in app.config. Wenn es nicht ist, dann habe es einfach als ein 'const' Feld in deiner Klasse. –

Antwort

1

Klicken Sie auf die Projektoptionen und wählen Sie Einstellungen:

pic

Geben Sie die Standardwerte

pic

und Ihr Programm können diese Werte (von der .settings Datei lesen oder die Standard) mit folgendem Code

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

Wenn Sie den Einstellungswert im Programm ändern, müssen Sie die neuen Werte speichern, bevor Sie die Anwendung beenden. Dies geschieht mit Properties.Settings.Default.Save();. Dieser Befehl erstellt eine .config Datei mit Ihren Werten. Diese werden beim Programmstart automatisch gelesen.

Der Inhalt ist eine XML Datei mit den Einstellungswerten deutlich sichtbar.

<?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> 
+0

Danke vert viel! Haben Sie eine Idee, warum ich die Einstellungen nicht bearbeiten lassen könnte? Ich habe herausgefunden, wie man sie vorher verfügbar machen kann, aber leider habe ich es vergessen. Ist es der Modus, in dem ich bin oder so? –

+0

Oh, ich habe VS geschlossen und es wieder geöffnet und es hat funktioniert. Nur eine Frage; muss ich den Code 'static void Main (string [] args)' irgendwo in mein Projekt einfügen, damit dies funktioniert oder wird es automatisch erstellt? –

+0

Oh, sorry, auch, welche Einheit sind die SizeLimit und ToDelete Werte? Bytes? –

1

Löschen von Dateien bin mit ist lückenhaft, wenn Sie versehentlich in einer fehlerhaften Zeichenfolge übergeben oder einfach die falsche Zeichenfolge dann werden Sie den Verlust von Daten sein, wie aus Versehen Ihre einzige Kopie des Löschen Ihre Doktorarbeit oder Zerstörung Ihres Betriebssystems. Also, ich werde einfach zeigen, wie eine Methode aufrufen, anstatt Sie zu zeigen, wie Sie diesen Code verwenden, um Sie gegeben wurden:

Beginnend mit einem Hello World! Beispiel:

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(); 
    } 
} 

Nun wollen wir unsere eigenen implementieren Verfahren jede Zeichenfolge an die Konsole drucken:

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

Schließlich wollen wir in einem anderen Parameter übergeben zu steuern, wie oft die Zeile gedruckt wird:

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

Sie erhielten eine Methode, aber keine wo sind Sie Aufruf diese Methode. Beachten Sie, wie ich in meinem Programm PrintToConsole() irgendwo aufrufen muss, und das ist eine Konsolenanwendung das gesamte Programm startet und endet in Main(), so dass, wo ich den Code einlege. Sie könnten technisch den Körper Ihrer Methode nehmen und direkt in Main einfügen, dann überall wo Sie die Verwendung der Variablen folderPath sehen, ersetzen Sie es durch die tatsächliche Zeichenfolge "C:\\SysApp" und ebenso mit den anderen 2 Parametern und das Programm würde das gleiche funktionieren.

+0

Das hilft mir, eine Menge anderer Dinge zu verstehen, die ich vorher nie verstanden habe. Vielen Dank. :) Ich dachte, dass dieser Code in einer Klasse gebucht werden musste, obwohl. Wie könnte es in Main eingefügt werden? Ich habe versucht, jede Instanz von 'folderPath' durch' C: \\ SysApp' und jede Instanz von 'folderSizeLimit' mit' 150 * 1024 * 1024' und jede Instanz von 'amountToDelete' mit' 149 * 1024 * 1024' zu ersetzen Ich hatte 78 Fehler. Ich muss wirklich falsch verstanden haben, was du meintest. [Hier sind die Fehler in einem Google-Blatt.] (Https://docs.google.com/spreadsheets/d/1D5gbA22v7N3fLdHdo25H1fd7M6acr34hB4St09iS094/edit?usp=sharing) –

+0

Für die Zeilenreferenz: [link] (http: // tinypic .com/r/2hwzmso/9) –

+0

Es gibt eine Website, die C# -Code namens dotnetfiddle kompiliert und ausführt. [Hier] (https://dotnetfiddle.net/q0EfG8) ist, was ich bekommen habe.Beachten Sie, dass ich 'using System.IO;', 'using System.Linq;' an der Spitze hinzufügen musste, da 'DirectoryInfo()' wirklich 'System.IO.DirectoryInfo()' ist und 'Sum()' wirklich in ist der 'System.Linq'-Namespace. Beachten Sie auch, dass wenn Sie das Programm "ausführen", es eine Zugriffsausnahme gibt, weil der Eigentümer der Website jedem Zugriff auf das Laufwerk "C:" verbietet, so dass unser Code den Ordner "C: \ SysApp" nicht löschen kann selbst wenn es auf diesem System existierte. – Quantic

Verwandte Themen