Cómo obtener archivos en una ruta relativa en C#


Si tengo un ejecutable llamado app.exe, que es lo que estoy codificando en C#, cómo obtendría archivos de una carpeta cargada en el mismo directorio que la aplicación.exe, ¿usando rutas relativas?

Esto arroja un carácter ilegal en la excepción de ruta:

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

¿Cómo se haría esto en C#?

Author: Peter Mortensen, 2010-07-16

5 answers

Para asegurarse de que tiene la ruta de la aplicación (y no solo el directorio actual), use esto:

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

Ahora tiene un objeto Process que representa el proceso que se está ejecutando.

Luego use Process.MainModule.FileName:

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

Finalmente, use Path.GetDirectoryName para obtener la carpeta que contiene el .exe:

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

Así que esto es lo que quieres:

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

(Observe que "\Archive\" de su pregunta es ahora @"\Archive\": necesita el @ para que las \ barras invertidas no se interpreten como el inicio de una secuencia de escape)

¡Espero que eso ayude!

 37
Author: Kieren Johnstone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
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");

El primer parámetro es la ruta. El segundo es el patrón de búsqueda que desea utilizar.

 29
Author: Adam Lear,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-16 13:23:26

Escríbelo así:

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

. es para relativo a la carpeta donde inició su exe, y @ para permitir \ en el nombre.

Cuando se utilizan filtros, se pasa como segundo parámetro. También puede agregar un tercer parámetro para especificar si desea buscar recursivamente el patrón.

Con el fin de obtener la carpeta donde su .exe reside realmente, use:

var executingPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
 15
Author: Mikael Svenson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-15 20:43:08

Como otros han dicho, puede/debe anteponer la cadena con @ (aunque también podría simplemente escapar de las barras invertidas), pero lo que se pasó por alto (es decir, no lo sacó a pesar de hacer un cambio relacionado con él) fue el hecho de que, como descubrí recientemente, usar \ al principio de un nombre de ruta, sin . para representar el directorio actual, se refiere a la raíz del árbol de directorios actual.

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

Versus

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

(Usando . por sí mismo tiene lo mismo efecto como usar .\ por sí mismo, desde mi experiencia. No se si hay casos específicos donde de alguna manera no significarían lo mismo.)

También podrías dejar el encabezado .\, si quieres.

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

De hecho, si realmente quieres, ni siquiera necesitas usar barras invertidas. Forwardslashes funcionan perfectamente bien! (Aunque un solo / no se alias a la raíz de la unidad actual como lo hace \.)

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

Incluso podrías alternar ellos.

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

...Realmente me he salido del tema aquí, sin embargo, así que siéntete libre de ignorar todo esto si no estás interesado.

 2
Author: JAB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-15 20:39:25

Bastante sencillo, utilice la ruta relativa

string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv");
 0
Author: Alejandro R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-12 19:49:33