7 Stimmen

C# - Nummer an die gespeicherte Datei anhängen

Ich habe ein Screenshot-Programm erstellt und alles funktioniert wunderbar. Das einzige Problem ist, dass ich nicht sicher bin, wie ich es so einrichten kann, dass die Screenshots mit angehängten Nummern gespeichert werden.

Beispiel: Screenshot 1, Screenshot 2, Screenshot 3, Screenshot 4, usw.

Dies kann natürlich auch auf andere Dateien angewandt werden, die gespeichert werden. Hat jemand eine Idee? Ich danke Ihnen.

0 Stimmen

Vielleicht könnten Sie uns den Code zeigen, den Sie bisher geschrieben haben...

13voto

Rex M Punkte 138455

Hier ist eine Methode, die ich in diesem Fall häufig anwende. Geben Sie einfach eine Zeichenfolge wie "Screenshot" ein, und es wird der niedrigste verfügbare Dateiname im Format "Screenshot [Nummer]" gefunden (oder einfach "Screenshot", wenn es noch keinen gibt):

private string GetUniqueName(string name, string folderPath)
{
    string validatedName = name;
    int tries = 1;
    while (File.Exists(folderPath + validatedName))
    {
        validatedName = string.Format("{0} [{1}]", name, tries++);
    }
    return validatedName;
}

(Hinweis: Dies ist eine leicht vereinfachte Version, bei der die Dateierweiterungen nicht berücksichtigt werden).

3voto

Timothy Walters Punkte 16633

Gibt es einen Grund dafür, dass Sie Zahlen verwenden? Wird derselbe Ordner später für eine andere Sitzung wiederverwendet? Sollen die Nummern neu gestartet werden und bestehende Dateien ersetzen, wenn sich der Tag ändert?

Das sind die Dinge, die man im Auge behalten sollte. Es ist erwähnenswert, dass OS X früher "Bild 1" und "Bild 2" für Screenshots verwendet hat. In der neuen Version wird nun glücklicherweise "Screenshot aufgenommen am 08.12.2009 um 11.35.12" oder etwas Ähnliches verwendet, was eine einfachere Sortierung nach Datum ermöglicht und Namenskonflikte leicht vermeidet.

Wie in anderen Vorschlägen erwähnt, müssen Sie noch prüfen, ob die Datei bereits existiert, und wenn Sie es erneut versuchen, wird DateTime.Now anders sein, so dass der Dateiname anders sein würde. Natürlich sollten Sie keine Konflikte bekommen, es sei denn, die Screenshots sind in der gleichen Millisekunde oder der Benutzer ist mit dem Datum / Uhrzeit durcheinander (oder Sommerzeit können Sie auch durcheinander bringen).

2voto

Rahatur Punkte 3000

Hier ist eine verfeinerte Lösung, die ursprünglich von Rex M. vorgeschlagen wurde. Sie erzeugt Dateinamen, wie sie in der eigentlichen Frage verlangt wurden:

public string GetUniqueName(string name, string folderPath)
{
    string pathAndFileName = Path.Combine(folderPath, name);
    string validatedName = name;
    string fileNameWithoutExt = Path.GetFileNameWithoutExtension(pathAndFileName);
    string ext = Path.GetExtension(pathAndFileName);
    int count = 1;
    while(File.Exists(Path.Combine(folderPath, validatedName)))
    {
        validatedName = string.Format("{0}{1}{2}",
            fileNameWithoutExt,
            count++,
            ext);
    }
    return validatedName;
}

Sie sollten immer die Path.Combine Funktion zu verwenden, anstatt eine String-basierte Verkettung durchzuführen, um Fehler auf dem Hosting-Server zu vermeiden. Sie wissen nie, wie die Website gehostet wird - Subdomain, Root-Site usw.

0voto

Alan Punkte 44139

Da Sie die Dateien schreiben, besteht ein Ansatz darin, das aktuelle Speicherverzeichnis zu durchsuchen und die neueste Datei mit dem Namen ScreenshotXX zu finden und eine Regex zu verwenden, um die Nummer aus dem Namen zu ermitteln.

Sie könnten die DirectoryInfo Klasse zusammen mit der Regex Klasse für diesen Zweck.

0voto

Andrew Keith Punkte 7362

Zusammenfassung der Lösung

  1. Directory.GetFiles(dest);
  2. Dateinamen sortieren
  3. Analysieren Sie den letzten Dateinamen und suchen Sie die letzte von Ihnen verwendete Nummer.
  4. schreibt die nächste Datei mit der nächsten angehängten Nummer.

Würde das für Sie funktionieren?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X