J'écris un .NET WINFFOMSS sur et basculez constamment entre les configurations de débogage et de libération et j'ai quelques fichiers que j'ai besoin de la configuration pour pouvoir vous rendre.
Ce que je pensais faire était de mettre les fichiers. Dans un répertoire commun dans le dossier bin, il ressemblerait à ceci: p> et je pensais à accéder aux fichiers à l'aide de quelque chose dans le sens de: p> < Pré> xxx pré> Ma question est si cela est dangereux depuis que, de ce que j'ai lu, Devrais-je plutôt utiliser quelque chose dans les lignes de: p> ou strong > Y a-t-il un moyen encore meilleur d'accéder au dossier system.io.directory.getCurrentDirectory code> peut changer en raison de l'utilisateur en sélectionnant un nouveau courant Répertoire dans, dis, une boîte de dialogue de fichier ouvert. p>
/ bin code> afin que je puisse passer de là ou un lieu / lieu généralement accepté pour stocker des fichiers que le programme doit généralement atteindre ce moyen de référencer plus facilement que (Peut-être que quelque chose qui a fait fonctionner avec n'importe quel type d'application A Nd non seulement Winforms)? P> P>
5 Réponses :
Vous pouvez obtenir l'emplacement de votre application .exe de votre application avec system.reflet.assembly.getexecutingassemblage (). Emplacement code>.
string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string exeDir = System.IO.Path.GetDirectoryName(exePath);
DirectoryInfo binDir = System.IO.Directory.GetParent(exeDir);
Si un assemblage est copié par l'ombre, Assembly.Location contient l'emplacement après avoir été copié par l'ombre. Une meilleure solution consiste à utiliser AppDomain.Basedirectory: Stackoverflow.com/a/6041505/13087
Si vous avez des données de configuration, etc. Je les stockerais dans le répertoire% Appdata%. Mettre des fichiers pouvant être modifiés dans le répertoire d'installation n'est pas une bonne idée et est interdit depuis Windows Vista. Les données de configuration doivent être stockées dans le dossier% AppData%, qui est un dossier spécial. N'acceptez pas son trajet dans votre programme - les utilisateurs de pays étrangers ou de fenêtres 32/64 bits auront de graves problèmes. P>
Une bonne idée de savoir comment accéder au dossier Appdata Pouvez-vous voir ici: Comment créer un dossier AppData avec C # P>
Ce n'est pas vraiment des données de configuration - il s'agit davantage de fichiers dont les besoins du programme au moment de l'exécution ... Je suis légèrement hésitant à les copier constamment au dossier AppData sur chaque ordinateur d'OSER, car de nombreux utilisateurs devront utiliser ce programme une fois. Sur un lecteur partagé dans mon organisation à ce stade ... Toute pensée à ce sujet ??
@Johnbustos qui est définitivement un point valide. J'ai une coniguration très similaire au travail et j'ai simplement enregistré un chemin dans les protégées du programme. Comme il est stocké comme paramètre, il est facile de créer un petit écran qui permet à l'utilisateur de sélectionner un nouvel emplacement de fichier. Je suis hésitant à coder le chemin - cela peut changer à l'avenir.
Le code suivant est de http: // msdn .microsoft.com / fr-US / US / Bibliothèque / MS229654 (v = vs.90) .aspx
Je le ferais comme suit:
créer un sous-dossier pour les fichiers de votre projet, par exemple "Commonfiles". P> Li>
Mettez les fichiers de configuration dans ce dossier. Définir leurs propriétés sur: p>
Build Action = Contenu P> Li>
Copier au répertoire de sortie = Copier toujours (ou peut-être: Copier si plus récent) P> LI> ul> li>
Les fichiers seront ensuite copiés dans Bin \ Debug \ CommonFiles ou Bin \ version \ CommonFiles à chaque construction de votre application. Vous pouvez les référer comme: p>
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CommonFiles\MyFile.Dat");
Cela semble être l'idée la plus intelligente ... les deux pour tous ces fichiers nous aurons besoin et aussi pour .dlls nécessaires ... Maintenant, je sais que cela pourrait sembler étrange, mais il y a probablement environ 50 fichiers de 10 ou plus différents Les répertoires dont je devrais le faire (basé sur l'entrée de l'utilisateur, il ouvre un fichier spécifique) ... Existe-t-il un moyen de modifier ces propriétés pour ce répertoire entier à la fois ou devrais-je devoir faire ce fichier-fichier ... Ou, compte tenu de ce nouveau bit de données, existe-t-il une façon différente de recommander ?? MERCI!!!
Je pense que cette technique est appropriée pour un nombre relativement petit de fichiers de configuration lisonly, avec tous les fichiers existants au moment de la construction. S'ils sont en lecture / écriture de fichiers et / ou d'utilisateurs peuvent ajouter des fichiers supplémentaires, je ne ferais pas cela. Au lieu de cela, mettez plutôt les fichiers dans un emplacement approprié en dehors du dossier BIN (celui que l'utilisateur peut écrire sur s'ils sont des fichiers de lecture / écriture) et ajoutez un paramètre de configuration à votre app.config avec le répertoire contenant les fichiers.
Merci, Joe - Ils ne sont pas écrits, il suffit de vous enregistrer sur la machine utilisateur ... Juste beaucoup de modèles différents et à des fins différentes, donc dans les sous-dossiers ... vous diriez toujours de le faire avec l'app.config ?? Comment suggéreriez-vous que le mieux être fait (peut-être que la solution de Tim avec votre suggestion / modification ajoutée ??? - merci encore pour votre aide continue !!
Joe, j'ai trouvé une solution pour faire votre travail ... Je le pose comme une solution séparée pour montrer aux gens ce que je faisais, mais je pense que vous avez eu la meilleure solution une fois que j'ai découvert comment faire les tâches nécessaires. . MERCI!!!
Bien que la plupart des réponses aient semblé fonctionner, La solution offerte par Joe ci-dessus , après un peu de Tweaking, s'est avéré être la meilleure solution pour ma situation. P>
Premièrement, la solution finale que je suis allé avec: p>
fichiers communs code> (dans mon cas, au même niveau que mon code> bin code>, mais ce n'est pas nécessaire, il expliquera simplement comment le code i 'll mettre des travaux ultérieurs) li>
- édité mon
.vbproj code> (ou `, CSPROJ ') pour définir tous les fichiers de ce répertoire (y compris les sous-répertoires) comme fichiers de ressources supplémentaires pour mon projet LI>
- a créé une seconde modification à mon
.vbproj code> pour copier tous ces fichiers de ressources dans mon répertoire Bin \ Debug ou Bin \ Living à Build Time. Li>
ul>
Deuxièmement, comment j'ai appris à faire ceci: p>
- Solution Joes ci-dessus LI>
- Ce lien montre comment pouvoir ajouter Dans les caractères génériques des fichiers .vbroj / .csproj afin que vous puissiez ajouter des répertoires complètes à la fois. LI>
- Cette réponse qui montre comment copier les fichiers sur My \ Bin Directory LI>
ul>
Enfin, ma solution: p>
- J'ai ouvert mon projet.vbProj Li>
- ci-dessus strong> la ligne
code>, j'ai ajouté dans un nouveau itemgroup code> comme suit: li>
ul>
itemgroup> code> p> p> p> P>
Cette charge dans tous les fichiers (y compris tous les sous-dossiers) et donne i l'action de construction commonfiles code> p>
-
sous strong> la ligne code>, j'ai ajouté dans les lignes suivantes: < / p>
$ (prépareforridePendson); copiecommonfiles prépareforridePendsON> Propertygroup> code> p> p> LI>
ul>
cible> Code> p>
Ceci copiera les fichiers du CommonFiles CODE> Construire une action dans vos annuaires BIN \ DEBUG / BIN \ Livraison à la période de construction. P>
Et c'est comme ça que je l'ai fait .... p>
Tous les commentaires / pensées sont vraiment appréciés) Si vous pensez avoir dû utiliser un autre moyen ou autre chose) .... p>
Ceci p>
Le répertoire bin est un détail de mise en œuvre du système de construction VS. Comme il est peu probable que vous alliez expédier votre projet avec un code source au client et que vous ne pourrez pas enregistrer des fichiers dans c: \ Program Files \ bin, ce n'est pas une bonne pratique. Utilisez% Appdata% pour des fichiers écrits, votre répertoire EXE ou% programdata% pour des fichiers en lecture seule.
Merci@hanspassant ... comme je l'ai dit chrétien, je suis légèrement hésitant à les copier constamment au dossier Appdata de chaque ordinateur, car de nombreux utilisateurs n'auront que besoin d'utiliser ce programme une fois et il est sur un lecteur partagé de mon organisation à Ce point ... toutes les pensées à ce sujet ??