7
votes

C # - Numéro d'annexe pour être enregistré

J'ai créé un programme d'écran et tout travaille bien. Le seul problème est que je ne suis pas sûr de savoir comment je peux le faire afin que les captures d'écran soient enregistrées avec des numéros ajoutés.

Exemple: Capture d'écran 1, capture d'écran 2, capture d'écran 3, capture d'écran 4, etc.

Évidemment, cela pourrait être appliqué à d'autres fichiers sauvegardés. Des idées? Merci.


1 commentaires

Peut-être que vous pourriez nous montrer le code que vous avez écrit jusqu'à présent ...


6 Réponses :


0
votes

Comme vous écrivez les fichiers, une approche consiste à rechercher dans le répertoire de sauvegarde en cours et à rechercher le dernier fichier appelé Screenshotxx et à utiliser une regex pour obtenir le numéro du nom.

Vous pouvez utiliser la classe DistoireIfo avec la classe Regex pour cela.


2 commentaires

Cela pourrait facilement casser. Et si l'utilisateur crée un fichier portant le nom de l'un des fichiers de capture d'écran? Et si l'utilisateur édite un ancien fichier de capture d'écran? La solution doit vérifier l'existence de chaque fichier jusqu'à ce qu'il trouve un "espace".


@jnylen: Que se passe-t-il si l'utilisateur crée un fichier qui porte le nom de l'un des fichiers de capture d'écran? >> Vous ne pouvez pas avoir deux fichiers avec des noms identiques. Et si l'utilisateur édite un ancien fichier de capture d'écran? >> La modification d'un fichier n'aura pas d'importance, car elle ne modifie pas la date de création. La solution doit vérifier l'existence de chaque fichier jusqu'à ce qu'il trouve un "espace". >> assez vrai. Toutefois, si cela ne peut pas écrire le fichier (car il existe), il devrait augmenter le nombre jusqu'à ce qu'il puisse écrire. Je ne pense pas à chercher un écart est une bonne idée, car si vous avez SS1, SS3, SS4, la dernière capture d'écran sera SS2?



0
votes

Résumé de la solution

  1. annuaire.getfiles (Dest);
  2. Trier les noms de fichiers
  3. Analysez le dernier nom de fichier, recherchez le dernier numéro que vous avez utilisé
  4. Écrivez le fichier suivant avec le numéro suivant annexé à celui-ci.

    Cela fonctionnerait-il pour vous?


0 commentaires

13
votes

Voici une méthode que j'utilise fréquemment pour ce cas même. Il suffit de passer dans une chaîne comme "capture d'écran" et il trouvera le nom de fichier disponible le plus bas disponible dans le format de "capture d'écran [numéro]" (ou simplement "capture d'écran" s'il n'y en a pas déjà):

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


6 commentaires

Merci! C'est exactement ce dont j'ai besoin. Parfait comment il vérifie le nom de fichier disponible le plus bas, destiné à mettre cela dans la question. Merci beaucoup monsieur.


J'utiliserais path.combine (folderpath, validatednameName) à la place de folderPath + validatedname .


Sarah a raison. Sans path.combine (folderpath, validationNameName), il ne fonctionnera jamais car cela prendrait le nom du dossier dans le nom du nom du fichier. J'ai mis le bloc de code corrigé ci-dessous initialement proposé par Rex M.


Si le nom a une extension sur elle déjà, vous pouvez utiliser déjà: String Extension = chemin.getextension (nom); nom = path.getfilenamewithtextension (nom); < / code> et validationNameName = string.format ("{0} [{1}]. {2}", nom, essais ++, extension);


@LCO: Je crois que l'extension Var a le "." inclus. Donc, des périodes de duplication de votre réponse.


@goodwince bons prises, tu as raison! Malheureusement, il est trop tard pour modifier mon commentaire à validatedname = string.format ("{0} [{1}] {2}", nom, essais ++, extension);



3
votes

Y a-t-il une raison pour laquelle vous utilisez des chiffres? Le même dossier sera-t-il réutilisé ultérieurement pour une autre session? Si les numéros redémarrent et remplacent les fichiers existants si le jour est différent?

Ce sont les sortes de choses à garder à l'esprit. Il convient de noter que le système d'exploitation X utilisait "Photo 1", "Image 2" Lorsque vous faites des captures d'écran et heureusement dans la nouvelle version utilise désormais "Capture d'écran prise le 2009-12-08 à 11.35.12" ou quelque chose de similaire, ce qui permet Tri plus facilement par date, évitant facilement les conflits de dénomination, etc.

Comme indiqué dans d'autres suggestions, vous devez toujours faire un chèque si le fichier existe déjà, et lorsque vous réessayez DateTime.Now sera différent, le nom du fichier serait différent. Bien sûr, vous ne devriez pas obtenir de conflits à moins que les captures d'écran ne soient dans le même milliseconde ou que l'utilisateur ne soit en train de gâcher avec la date / l'heure (ou l'épargne de la lumière du jour peut vous gâter aussi).


2 commentaires

Actuellement, les fichiers sont enregistrés à l'aide d'un horodatage. Mais certaines personnes m'ont demandé si je pouvais inclure une option qui ajoute un numéro à la fin du nom du fichier si c'est la manière dont ils choisissent le fichier à enregistrer. J'apprécie votre suggestion.


Dans ce cas, vous avez deux options, soit une boucle à l'aide de fichiers.exists vérifie avec chaque numéro successivement (rapide et sale) ou obtenir une liste de fichiers et trouver le plus grand nombre et ajouter 1. Dépend de ce que vous voulez faire si quelqu'un a «une capture d'écran 1 "," Screenshot 2 "," Screenshot 33 "supposant qu'ils ont supprimé un groupe entre-deux, le suivant doit-il être 3 ou 34?



0
votes

C'est ce que j'utilise:

Chemin de chaîne = environnement.getFolderPath (environnement.specialfolder.desktop); String Newpath; Liste fichiers = nouvelle liste (répertoire.getfiles (chemin, "*. Txt", searchoption.topdirectoryonon)); pour (int i = 0; fichiers.contains (newPath = string.format (chemin + @ "\ textfile {0} .txt", i); i ++) { Console.writeline ("Fichier: {0} existe-t-il à sauter ...", NewPath); } Fichier.writetealltext (NewPath, "Dummy");


0 commentaires

2
votes

Voici une solution raffinée initialement proposée par Rex M. Il générera des noms de fichiers comme on a été demandé dans la question réelle: xxx

Vous devez toujours utiliser le chemin . Fonction Au lieu de faire une concaténation à chaîne pour éviter les erreurs sur le serveur d'hébergement. Vous ne savez jamais comment le site Web sera hébergé - sous-domaine, site racine, etc.


2 commentaires

Vous voudrez peut-être cacher le chemin.getfilenamewithoutextension & path.getextension dans des variables locales.


@ALEXISPAUTROT J'ai mis à jour le code. Merci pour la suggestion.