web-dev-qa-db-fra.com

Comment obtenir des fichiers dans un chemin relatif en C #

Si j’ai un exécutable appelé app.exe (c’est ce que je code en C #), comment puis-je obtenir des fichiers d’un dossier chargé dans le même répertoire que app.exe, en utilisant des chemins relatifs?

Cela jette une exception de caractères illégaux dans le chemin:

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

Comment ferait-on cela en C #?

27
Joan Venge

Pour vous assurer que vous avez le chemin de l'application (et pas seulement le répertoire actuel), 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 fichier .exe:

http://msdn.Microsoft.com/en-us/library/system.io.path.getdirectoryname.aspx

Alors 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 cela pourra aider!

37
Kieren Johnstone
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. La seconde est le modèle de recherche que vous souhaitez utiliser.

29
Adam Lear

Écris-le comme ceci:

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

. est pour relatif au dossier où vous avez démarré votre fichier .exe et @ pour autoriser le nom \.

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

Pour obtenir le dossier dans lequel réside votre fichier .exe, utilisez:

var executingPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
15
Mikael Svenson

Comme d'autres l'ont déjà dit, vous pouvez/devriez préfixer la chaîne avec @ (bien que vous puissiez également échapper aux barres obliques inverses), mais ce qu'ils ont omis (c'est-à-dire qu'ils ne l'ont pas évoquée malgré les modifications qui y sont apportées) était Le fait que, comme je l'ai découvert récemment, utiliser \ au début d'un chemin, sans que . représente le répertoire actuel, fait référence à la racine de l'arborescence actuelle.

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

versus

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

(Utiliser . seul a le même effet que d'utiliser .\ seul, d'après mon expérience. Je ne sais pas s'il existe des cas spécifiques où, d'une manière ou d'une autre, ils ne signifieraient pas la même chose.)

Vous pouvez aussi simplement laisser le .\ en tête, si vous le souhaitez.

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. Les slashs fonctionnent parfaitement bien! (Bien qu'un seul / ne soit pas alias à la racine du lecteur actuel comme le fait \.)

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

Vous pouvez même les alterner.

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

... Je suis vraiment sorti du sujet ici, alors n'hésitez pas à ignorer tout cela si cela ne vous intéresse pas.

2
JAB

Assez simple, utilisez le chemin relatif

string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv");
0
Alejandro R