IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Bonne gestion des fichiers temporaires ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut Bonne gestion des fichiers temporaires ?
    Bonjour à tous,

    Je développe actuellement une petite application pour récupérer des pochètes d'albums MP3. cette application, développée en C#, télécharge de nombreuses images et les stock sous forme de fichiers temporaires. Je n'ai jamais travaillé avec des fichiers temporaires et je ne sais pas quels sont les bonnes pratiques à adopter.

    Mes questions sont donc les suivantes :
    -Quel répertoire serait le plus approprié pour stocker mes images
    -Dois-je supprimer les images à la fermeture de mon application
    -Si oui, quel événement de mon application pourrait être approprié pour déclencher le nettoyage (je crains que certains fichiers soient en cours d'utilisation...)

    Merci pour votre aide !

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par monstroplante Voir le message
    -Quel répertoire serait le plus approprié pour stocker mes images
    Cela dépend de ton OS mais sous linux/unix, c'est /tmp et sous Microsoft, c'est le répertoire pointé par la variable d'environnement TEMP ou TMP. Après cela, tu as la fonction tmpnam() qui est utile pour générer des fichiers temporaires dans un répertoire donné (voir ici : http://man.he.net/man3/tmpnam)

    Citation Envoyé par monstroplante Voir le message
    -Dois-je supprimer les images à la fermeture de mon application
    Je dirai oui mais cela dépend du contenu de tes fichiers. Si les refaire ne coûte rien, aloors clairement oui sinon, cela peut être des fichiers temporaires dont l'effacement à peu d'importance (genre les fichiers du cache internet local)

    Citation Envoyé par monstroplante Voir le message
    -Si oui, quel événement de mon application pourrait être approprié pour déclencher le nettoyage (je crains que certains fichiers soient en cours d'utilisation...)
    Cela dépend de ton application, sous linux/unix, tu peux installer une fonction avec atexit()
    pour faire le ménage (voir ici : http://www.linux-kheops.com/doc/man/.../atexit.3.html) sinom, pour une appli Windows, tu peux gérer l'événement WM_CLOSE
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    Merci pour tes réponses. J'ai un peu avancé sur le problème et créé cette classe pour me faciliter les choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    	static class FileHelper {
    		private static string _tempFolder;
    		public static string TempFolder{
    			get {
    				if (_tempFolder == null) {
    					_tempFolder = Path.Combine(Path.GetTempPath(),Guid.NewGuid().ToString());
    					Directory.CreateDirectory(_tempFolder);
    					Application.Current.Exit += new ExitEventHandler(Application_Exit);
    				}
    				return _tempFolder;
    			}
    		}
     
    		public static string GetTempFileName() {
    			return Path.Combine(TempFolder, Guid.NewGuid().ToString());
    		}
     
     
    		/// <summary>
    		/// Supprime le dossier temporaire à la fermeture de l'application
    		/// </summary>
    		/// <param name="sender"></param>
    		/// <param name="e"></param>
    		static void Application_Exit(object sender, ExitEventArgs e) {
    			Directory.Delete(_tempFolder,true);
    		}
    	}
    Le problème c'est que, comme je le craignais, certains fichiers sont en cours d'utilisation à la fermeture du programme. Cela s'explique car je télécharge les images sur des thread différents qui sont, semble-il, encore actifs lors de l'événement "Exit" de l'application.

    J'ai pensé utiliser l'attribut "DELETE_ON_CLOSE" mais je n'ai pas trouvé comment éditer les attributs "Extended" en C#.

    Si vous avez un avis, une idée, je suis preneur (ce post serait peut être plus à sa place sur le forum c# ? si un modo passe par là...)

  4. #4
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Oula, arrête tout.


  5. #5
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    Oui, j'avais vu la méthode "Path.GetTempFileName()" mais je ne vois pas en quoi elle serait mieu adaptée car :
    1) Elle ne gère en rien la suppression des fichiers temporaires. Ce qui est finalement mon seul vrai problème.
    2) Elle crée un fichier vide, ce que ne souhaite pas.
    3) Elle crée le fichier temporaire à la racine du répertoire temp or je préfère regrouper mes fichiers dans un sous-dossier car j'en utilise un grand nombre.


    Finalement ma classe "FileHelper" me plait bien mais mon problème c'est que j'ai plusieurs background workers qui téléchargent des fichiers à l'aide de WebCilents. Je pense que c'est eux qui empèchent la suppression des fichiers à la fermeture de l'application.

    (Cela peut paraitre étrange d'utiliser des WebClient avec des BackgroundWorkers mais je n'aprécie pas la méthode "DownloadFileAsync". Cette dernière ne travaile dans un thread séparé qu'après avoir résolu l'éventuel nom DNS contenu dans l'url. Ce qui entraine des lag sur le thread principal.)

    PS : Merci pour le déplacement du post.

  6. #6
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Citation Envoyé par monstroplante Voir le message
    Oui, j'avais vu la méthode "Path.GetTempFileName()" mais je ne vois pas en quoi elle serait mieu adaptée car :
    1) Elle ne gère en rien la suppression des fichiers temporaires. Ce qui est finalement mon seul vrai problème.
    2) Elle crée un fichier vide, ce que ne souhaite pas.
    3) Elle crée le fichier temporaire à la racine du répertoire temp or je préfère regrouper mes fichiers dans un sous-dossier car j'en utilise un grand nombre.
    Ok, au temps pour moi, j'ai lu le post un peu rapidement qui plus est car tu faisais déjà utilisation de Path.GetTempPath()

    Après ça me semble un peu bizarre de classer des fichiers temporaires, surtout s'ils ne doivent pas persister à la fin de l'application. Mais pourquoi pas.

    L'idéal serait sans doute, avant de détruire le répertoire, de demander à tous tes threads de te terminer, et d'attendre que ce soit le cas. Cela suppose bien évidemment de conserver une liste de ces threads quelque part, mais j'imagine que c'est déjà le cas.

    Mais au fond, pourquoi ne pas détruire ce que tu peux, et laisser le répertoire temporaire dans l'état où il se trouvera ? Le but de ce répertoire est bel et bien de servir de poubelle en cas de besoin, et, dans le cas où l'utilisateur aurait besoin de place, le système lui proposera de lui même de faire le ménage dans ce répertoire (en tout cas sous Windows)

    Je conçois qu'il soit satisfaisant de faire le ménage derrière soi, mais est-ce vraiment grave de laisser quelques fichiers dans le répertoire temporaire, qui seront effacés si jamais le besoin s'en fait sentir ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FTP] Gestion des fichiers Online ?
    Par MaTHieU_ dans le forum Langage
    Réponses: 9
    Dernier message: 23/10/2005, 15h16
  2. Gestion des fichiers
    Par roger12 dans le forum Administration système
    Réponses: 2
    Dernier message: 19/10/2005, 09h01
  3. Y as il des fichiers temporaires sous builder
    Par Moutonstar dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/12/2004, 14h24
  4. Comment changer le répertoire des fichiers temporaires ?
    Par devdev dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 01/09/2004, 14h18
  5. [VB.NET]La bonne gestion des forms
    Par Wintermute dans le forum Windows Forms
    Réponses: 11
    Dernier message: 13/01/2004, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo