2010-07-15 28 views
24

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 caminos relativos?Cómo obtener archivos en una ruta relativa en C#

Esto arroja una excepción caracteres ilegales en ruta:

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

¿Cómo se podría hacer esto en C#?

Respuesta

34

para asegurarse de que tiene la ruta de la aplicación (y no sólo el directorio actual), utilice la siguiente:

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

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

A continuación, utilice Process.MainModule.FileName:

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

Por último, utilice Path.GetDirectoryName para obtener la carpeta que contiene el archivo .exe:

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

Así que esto es lo que quiere:

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

(Nótese que "\Archive\" de su pregunta es ahora @"\Archive\": se necesita el @ de manera que las barras invertidas \ no se interpretan como el inicio de una secuencia de escape)

Espero que ayude!

+6

Path.GetDirectoryName (Assembly.GetEntryAssembly(). Location); es más simple imo. –

+0

@Mikael, de acuerdo, intentaremos actualizar esta respuesta en breve –

+0

¿Cómo lo hace para un directorio virtual que se encuentra en la raíz superior de la aplicación web asignada a la ruta UNC? – ppumkin

29
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.

+0

Adición al comentario de Kieren: también hay cosas como OpenFileDialog y SaveFileDialog que pueden cambiar el directorio actual en tiempo de ejecución. (si la propiedad RestoreDirectory se deja en su valor predeterminado de falso). –

+0

Punto justo. Actualicé mi respuesta. @Moe: es bueno saberlo. No sabía que existiera RestoreDirectory. –

+0

Tema ligeramente apartado: tenga en cuenta que si desea archivos en el directorio actual no puede pasar una cadena vacía como argumento de ruta a Directory.GetFiles, sino "." trabajos. – yoyo

14

escritura de esta manera:

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.

el fin de obtener la carpeta en su .exe reside en realidad, el uso:

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

. \ Significa relativo al directorio actual, creo? –

+0

Un único punto (.) Puede sustituir al directorio actual. Dos puntos (..) significan el padre del directorio actual. –

+0

Exactamente, pero la pregunta es relativa al ejecutable, no al directorio actual ...? –

2

Como han dicho otros, puede/debe anteponer la cadena con @ (aunque también podría escapar de las barras diagonales inversas), pero lo pasaron por alto (es decir, no lo mencionó a pesar de hacer un cambio relacionado con) fue el hecho de que, como descubrí recientemente, el uso de \ al comienzo de una ruta de acceso, sin . para representar el directorio actual, hace referencia a la raíz del árbol de directorios actual.

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

frente

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

(Usando . por sí mismo tiene el mismo efecto que el uso .\ por sí mismo, de mi experiencia. No sé si hay casos específicos en los que de alguna manera no lo haría significa lo mismo.)

También podría dejar el .\, si lo desea.

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

De hecho, si realmente lo desea, ni siquiera necesita utilizar barras diagonales inversas. ¡Forwardslashes funcionan perfectamente bien! (Aunque un solo / no lo hace alias a la raíz de la unidad actual como \ lo hace.)

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

Incluso se puede alternarlos.

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

... En verdad me he salido del tema aquí, así que no dude en ignorar todo esto si no está interesado.

0

bastante sencillo, utilice la ruta relativa

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