Problema con Expresiones Regulares

08/12/2005 - 00:02 por final | Informe spam
Supongamos ke keremos leer todos los archivos en varios directorios y
desplegar sus nombres o copiarlos en un directorio para esto simplemente
hariamos lo siguiente:

Sub Main()
Dim files() As String = {"C:\prueva\Test.txt",
"C:\prueva1\File.txt", "C:\prueva\3.txt"}
Dim destino As String = "C:\dest\"
Dim nombrefich As String
Dim r As New
System.Text.RegularExpressions.Regex("(.:)(\\\w+\\)(?<fichero>\w+\.\w+)",
Text.RegularExpressions.RegexOptions.Compiled)
'para copiarlos solo hariamos lo siguiente...
For Each nombre As String In files
If r.Match(nombre).Success Then
nombrefich = r.Match(nombre).Result("${fichero}")
Console.WriteLine("Copiando: " & nombre & " A: " & destino &
nombrefich)
System.IO.File.Copy(nombre, destino & nombrefich)
End If
Next
Console.ReadLine()
End Sub

Ok Hasta aki todo anda bien pero... ¿y si el directorio donde se encuentra
contiene uno o mas subdirectorios? es decir si es "C:\prueva1\1\file.txt" o
si tuviese espacios "C:\prueva 1\file.txt" o son las dos cosas?? o si el
nombre del directorio contiene puntos "C:\mis.txt\file.txt" @_@(el solo
pensar en todas las probabilidades me marea) este codigo no funcionaria ya
que busca un caracter seguido de dos puntos "(.:)" seguido de una
antidiagonal seguida de una o mas palabras seguidas de una antidiagonal
"(\\\w+\\)" seguida de una o mas palabras seguidas de un punto seguido de
una o mas palabras y vaciarlo en fichero XD "(?<fichero>\w+\.\w+)" (@_@ Me
encanta lo complejo ke se ve esto jeje sobre todo para explicarlo XDXD pero
no es tanto XDXD) por lo que no encontraria nada en dicha cadena mi pregunta
es: ¿Como Puedo hacerle para que sin importar la profundidad del directorio
o si tiene espacios me encuentre el nombre del fichero? GRACIAS XD

Aunque este no es mi problema real ya que este se solucionaria facilmente
usando la clase system.io.fileinfo sobre cada entrada y posteriormente
obtener el name o fullname segun sea necesario... pero mi problema es que mi
programa obtiene los datos del usuario y los coloca en un array
posteriormente realiza las acciones necesarias con los archivos este es el
ejemplo mas sencillo que se me ocurrio XD para ke kede mas clara mi duda de
otra forma tendria que ponder todo el codigo de la clase en la cual estoy
trabajando XDXD y eso no es muy viable...

ATT Final XD

Sabio no es aquel que lo sabe todo si no el que sabe donde buscar y
como solucionar sus problemas XD
 

Leer las respuestas

#1 Tristan
08/12/2005 - 02:23 | Informe spam
No se si entiendo bien lo que quieres hacer. No entiendo para que utilizas
expresiones regulares. Si lo que quieres es extraer la parte del nombre del
fichero utiliza Path.GetFileName().

Por ejemplo este código realiza una copia recursiva de un directorio en
otro.

Public Shared Sub CopiaDirectorio(ByVal origen As String, ByVal destino As
String)
Directory.CreateDirectory(destino)
For Each dir As String In Directory.GetDirectories(origen)
CopiaDirectorio(dir, Path.Combine(destino, Path.GetFileName(dir)))
Next
For Each archivo As String In Directory.GetFiles(origen)
File.Copy(archivo, Path.Combine(destino, Path.GetFileName(archivo)),
True)
Next
End Sub

Juan Carlos Badiola
MVP - C#

Preguntas similares