2010-01-25 7 views
0

J'ai décidé de ne plus conserver les rapports dans l'application en tant que ressources intégrées et de les déplacer localement sur le serveur. Les avantages sont évidents, mais étant donné que je veux organiser les répertoires (rapports communs, en-têtes, etc.) de façon lisible. J'ai besoin d'un moyen de charger les rapports uniquement par leur nom, en appelant une méthode de recherche récursive. Mon plan est d'utiliser un cache qui peut être construit au début de l'application et ensuite chercher dans une liste OU utiliser une méthode qui recherche le nom du rapport chaque fois que j'ai besoin ... Toutes idées et un exemple avec le code (C#) sont très accueilli!Méthode de recherche récursive dans C#

Structure des dossiers peut être comme:

\\ rapports serveur Web de \ (fichiers de rapport avec des noms uniques)

\\ serveur Web \ Reports \ Common (fichiers de rapport avec des noms uniques)

\\ webserver \ Reports \ Manager1 (fichiers de rapport avec des noms uniques)

\\ serveur Web \ Reports \ Manager1 \ factures (fichiers de rapport avec des noms uniques)

\\ serveur web \ Rapports \ GestionnaireN (rapports des fichiers avec des noms uniques)

Espérons que cette exemplification soit utile! Je vous remercie!

+1

De quel produit de rapport utilisez-vous? Y at-il une raison pour laquelle vous ne pouvez pas avoir une table de recherche remplie à partir des entrées du fichier de configuration, par exemple, le rapport ABC se trouve dans/webserver/reports/repoart ABC.aspx? – slugster

+0

J'utilise des rapports Crystal pour une application de bureau avec un nombre inconnu de rapports et/ou de chemins (mais des noms de fichiers uniques dans cette structure de répertoires "\\ serveur web \ rapports"). – andySF

Répondre

5

Si vous souhaitez rechercher des répertoires récursivement pour une certaine extension (c.-à-gérer le cas où il doit être mis à jour, etc.):

var d = new DirectoryInfo("\\\\webserver\\Reports"); 
var files = d.GetFiles(".rpt", SearchOption.AllDirectories); 
+0

oh, c'est très utile! Je vous remercie! – andySF

+0

Une question. Quelle est la meilleure option? Pour remplir un dictionnaire (FileName, Path) ou pour remplir un tableau FileInfo [] pour les résultats futurs? c'est une différence de vitesse? J'aime tableau FileInfo pour ses informations complètes sur le fichier. Je n'en ai pas besoin pour le moment mais à l'avenir ça peut être utile! Longue histoire courte, une recherche de dictionnaire ou une recherche de tableau? Quel est ton opinion? Je vous remercie! – andySF

1

Au lieu de rechercher à chaque fois, vous enregistrez l'emplacement exact des rapports dans une section du fichier de configuration de votre application. Peut-être que c'est ce que vous voulez dire en construisant un cache.

+0

oui, c'est ce que je veux dire. J'ai besoin d'un conseil sur les meilleures pratiques dans ces situations. Vous pensez que le stockage de tous les fichiers au démarrage de l'application est bon. Je pense que le stockage des chemins et des noms dans un dictionnaire ou une table de données au démarrage est la meilleure solution. Ensuite, je peux les chercher là-bas et éventuellement si je ne trouve pas je peux faire une deuxième recherche juste au cas où. Merci beaucoup pour votre réponse rapide! – andySF

+0

Je suggérais que si vous avez un nombre fini de rapports et que votre application les référence, vous devez connaître les chemins d'accès aux fichiers et pouvoir les enregistrer dans le fichier de configuration. Vous pouvez créer votre répertoire en mémoire à partir de cela, au lieu de passer par le système de fichiers. Ensuite, si un rapport attendu n'est pas trouvé, vous pouvez essayer de le rechercher ou le gérer. – Jay

+0

oh, je vois. ce n'est pas un nombre fini de rapports et les noms (report.rpt) sont stockés dans une table de données sql (au lieu d'un dictionnaire dans le fichier de configuration). la table sql que j'ai trouvé plus accessible dans l'édition et la gestion des rapports. Je vous remercie! – andySF

1

s'il vous plaît se référer à cet article par Microsoft How to recursively search directories by using Visual C#

Il explique comment écrire votre fonction récursive (ce qui est très simple C#)

Si votre arborescence est pas trop grand (moins de 100 dirs et moins de, disons, 50 fichiers dans chaque répertoire), alors un cache n'est pas nécessaire (à mon humble avis). Si vous construisez un cache, vous devez prendre soin

void DirSearch(string sDir) { 
try 
{ 
    foreach (string d in Directory.GetDirectories(sDir)) 
    { 
    foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
    { 
     lstFilesFound.Items.Add(f); 
    } 
    DirSearch(d); /// Recursive Call !! 
    } 
} 
catch (System.Exception excpt) 
{ 
    Console.WriteLine(excpt.Message); 
}} 
+0

Je n'ai pas beaucoup de fichiers. Max 20,30 rapports par répertoire (max 20 dirs) qui peuvent croître mais jamais atteindre 100 dirs :). Cette méthode j'ai déjà lu et personnalisé pour mon usage. Je vous remercie! – andySF

Questions connexes