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 los archivos de una carpeta cargada en el mismo directorio que el app.exe, usando rutas relativas?

Esto arroja caracteres ilegales en la excepción de ruta:

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

¿Cómo se puede hacer esto en C #?

Para asegurarse de tener 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

Entonces 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 ahora es @"\Archive\" : necesita el @ para que las \ barras diagonales no se interpreten como el inicio de una secuencia de escape)

¡Espero que ayude!

 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.

Escríbelo así:

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

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

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

Para obtener la carpeta donde reside realmente su .exe, use:

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

Como han dicho otros, puede / debe anteponer la cadena con @ (aunque también podría escapar de las barras diagonales inversas), pero lo que pasaron por alto (es decir, no lo mencionó 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> 

(Usar . Por sí mismo tiene el mismo efecto que usar .\ Por sí mismo, según mi experiencia. No sé si hay casos específicos en los que de alguna manera no significaran lo mismo).

También podría dejar el líder .\ , Si lo desea.

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

De hecho, si realmente lo deseaba, ni siquiera necesita usar barras diagonales inversas. ¡Forwardslashes funcionan perfectamente bien! (Aunque una sola / no alias a la raíz de la unidad actual como \ does).

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

Incluso podrías alternarlos.

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

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

Bastante sencillo, use la ruta relativa

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