Comment obtenir des fichiers dans un chemin relatif en C#

Si j'ai un exécutable appelé app.exe qui est ce que je code en C#, Comment pourrais-je obtenir des fichiers à partir d'un dossier chargé dans le même répertoire que l'application.exe, en utilisant des chemins relatifs?

Cela lance un caractère illégal dans l'exception path:

string [ ] files = Directory.GetFiles ( "\Archive\*.zip" );

Comment ferait-on cela en C#?

27
demandé sur Peter Mortensen 2010-07-16 00:09:20

5 réponses

Pour vous assurer que vous avez le chemin de l'application (et pas seulement le répertoire courant), Utilisez ceci:

Http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getcurrentprocess.aspx

Vous avez maintenant un objet Process qui représente le processus en cours d'exécution.

Ensuite, utilisez Process.MainModule.FileName:

Http://msdn.microsoft.com/en-us/library/system.diagnostics.processmodule.filename.aspx

Enfin, utilisez Path.GetDirectoryName pour obtenir le dossier contenant le .exe:

Http://msdn.microsoft.com/en-us/library/system.io.path.getdirectoryname.aspx

C'est ce que vous voulez:

string folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Archive\";
string filter = "*.zip";
string[] files = Directory.GetFiles(folder, filter);

(notez que "\Archive\" de votre question est maintenant @"\Archive\": vous avez besoin du @ pour que les barres obliques inverses \ ne soient pas interprétées comme le début d'une séquence d'échappement)

J'espère que ça aide!

37
répondu Kieren Johnstone 2010-07-15 20:16:23
string currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string archiveFolder = Path.Combine(currentDirectory, "archive");
string[] files = Directory.GetFiles(archiveFolder, "*.zip");

Le premier paramètre est le chemin. Le deuxième est le modèle de recherche que vous souhaitez utiliser.

29
répondu Adam Lear 2010-07-16 13:23:26

Écrivez-le comme ceci:

string[] files = Directory.GetFiles(@".\Archive", "*.zip");

. est relatif au dossier où vous avez commencé votre exe, et @ pour permettre \ dans le nom.

Lorsque vous utilisez des filtres, vous le transmettez en tant que second paramètre. Vous pouvez également ajouter un troisième paramètre pour spécifier si vous souhaitez rechercher récursivement le motif.

Afin d'obtenir le dossier où votre .exe réside réellement, utilisez:

var executingPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
15
répondu Mikael Svenson 2010-07-15 20:43:08

Comme d'autres l'ont dit, Vous pouvez/devriez ajouter la chaîne avec @ (bien que vous puissiez aussi échapper aux barres obliques inverses), mais ce qu'ils ont passé sous silence (c'est-à-dire qu'ils ne l'ont pas mis en place malgré un changement) était le fait que, comme je l'ai récemment découvert, utiliser \ au début d'un chemin, Sans . pour représenter le répertoire courant, fait référence à la racine de l'arborescence des répertoires en cours.

C:\foo\bar>cd \
C:\>

Contre

C:\foo\bar>cd .\
C:\foo\bar>

(en utilisant . par lui-même a le même effet comme utilisant .\ par lui-même, d'après mon expérience. Je ne sais pas s'il y a des cas spécifiques où ils ne signifieraient pas la même chose.)

Vous pouvez également laisser le premier .\, Si vous voulez.

C:\foo>cd bar
C:\foo\bar>

En fait, si vous le vouliez vraiment, vous n'avez même pas besoin d'utiliser des barres obliques inverses. Forwardslashes fonctionnent parfaitement bien! (Bien qu'un seul / n'alias pas à la racine du lecteur actuel comme le fait \.)

C:\>cd foo/bar
C:\foo\bar>

Vous pourriez même alterner ils.

C:\>cd foo/bar\baz
C:\foo\bar\baz>

...Je suis vraiment hors sujet ici, alors n'hésitez pas à ignorer tout cela si vous n'êtes pas intéressé.

2
répondu JAB 2010-07-15 20:39:25

Assez simple, utilisez le chemin relatif

string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv");
0
répondu Alejandro R 2017-04-12 19:49:33