2009-07-16 5 views
1

J'écris une application console qui recherche des informations sur les packages SSIS dans SQL Server. Je l'ai travailler et écrire dans un fichier .csv. Je viens d'ajouter dans la possibilité de passer des commutateurs de ligne de commande pour nom de serveur, nom de fichier et fichier de sortie. Si un fichier de sortie n'est pas spécifié, je voudrais juste sortir sur la console, ce que je fais déjà.Fichier de sortie facultatif dans l'application de la console - rendre StreamWriter global

La façon dont j'ai traité l'écriture de fichier semble maladroite, et est probablement faux.

Dans ma méthode principale, je crée un StreamWriter. J'ai besoin d'écrire la sortie entière du programme dans ce fichier. J'explore les dossiers sous mon dossier spécifié en appelant récursivement une fonction.

Je passe l'objet StreamWriter dans tous les appels - c'est un paramètre dans les fonctions qui ne l'utilisent pas, donc il peut être passé à celui qui le fait. Il semble que je devrais pouvoir en faire une variable globale, mais je vois que C# n'a pas de globals et "si vous utilisez un global, vous le faites probablement mal". J'avais prévu de revisiter ce problème après avoir débranché un petit moment ce petit utilitaire, mais j'ai maintenant le problème que toutes les fonctions veulent l'objet StreamWriter - et si je le fais en option, alors il a gagné ' t être là pour les fonctions. Et il semble aussi que C# ne fasse pas d'arguments optionnels.

Je suis sûr que vous pouvez dire que je ne suis pas un expert en C# et que je ne fais que tremper quand j'en ai besoin. Merci pour votre aide.

Répondre

2

Vous souhaitez utiliser un modèle singleton pour désigner le StreamWriter que vous utilisez. Le singleton est un moyen de "simuler" la fonctionnalité des variables globales, sans en avoir les problèmes. Essentiellement, ce que le singleton fournit est une instance spécifique à la classe d'une ressource que vous souhaitez partager entre plusieurs parties différentes de votre application. La ressource est accessible via une instance de classe statique.

En fait, ce que vous voulez faire est de définir une classe qui a comme statique membre le StreamWriter que vous voulez utiliser; de cette façon, toute méthode que vous utilisez dans le reste de votre code peut accéder à cette instance SAME de StreamWriter en y accédant depuis la classe conteneur (sans avoir besoin de créer une instance de la classe, car elle est statique).

1

Quelque chose comme

public static class CsvWriter 
{ 
    private static StreamWriter _writer = new StreamWriter(...); 

    public static StreamWriter Writer 
    { 
     get { return _writer; } 
    } 
} 

Une certaine variation est possible, l'élément principal est la propriété statique ici. C'est comme un global mais pas (tout à fait) aussi mauvais.

+0

Salut Henk. Je reçois cette erreur sur le nouveau spot StreamWriter(). Aucune surcharge pour la méthode 'StreamWriter' prend les arguments '0'. J'ai essayé les modèles suivants à partir http://msdn.microsoft.com/en-us/library/ms998558.aspx et obtenir le même résultat. – Sam

+0

Oui, j'aurais dû mettre des points là ... Utilisez un nom de fichier ou un flux pour construire le StreamWriter. Vous avez probablement déjà quelque chose. –

+0

Merci de m'avoir aidé avec ce qui est probablement évident :) – Sam

0

Toutes les fonctions d'une même classe sont-elles identiques? Vous pouvez créer une variable de classe (un champ) et y accéder à partir de toutes les méthodes de la classe. Sinon, vous pouvez toujours créer une nouvelle classe publique avec un champ statique.

0

Je vous pouvez utiliser Console.SetOut pour cela:

static void Main(string[] args) 
{ 
    StreamWriter writer = new StreamWriter(@"c:\path\file.ext"); 
    try 
    { 
     Console.SetOut(writer); 
     Console.WriteLine("One"); 
     Console.WriteLine("Two"); 
     Console.WriteLine("Three"); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("That went wrong."); 
    } 
    finally 
    { 
     writer.Dispose(); 
    }  
} 
+0

C'est cool, mais la sortie de ma console est formatée pour être lisible, tandis que la sortie du fichier est csv. – Sam

Questions connexes