elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Problemas a listar Archivos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas a listar Archivos  (Leído 5,690 veces)
OscarCadenas_91

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Problemas a listar Archivos
« en: 3 Febrero 2015, 18:42 pm »


Hola a todos soy nuevo en este foro.

Comence hace 3 semanas a aprender VB.NET y despues de leer y leer  queria hacer mi primer programa es muy sencillo pero lo necesitaba, el programa lo que hace es buscar archivos con extension ".docx" y ".pptx" de mi memoria usb para luego copiar en otra carpeta, hasta hace un par de dias funcionaba, buscaba archivos y los mostraba en un listview1, pero ayer me infecte con un virus mi usb y oculto todas los archivos y carpetas y mi antivirus borro el virus, pero aun estaban ocultos los archivos y crei que igual deberia listar los archivos sin importar los atributos de oculto, pero cuando le doy a buscar me muestra el siguiente error:

Código:
No se controló StackOverflowException

Excepción no controlada del tipo 'System.StackOverflowException' en mscorlib.dll
Despues busque la forma de volver a mostrar los archivos desde el CMD de windows encontre que el virus movio todos mis archivos en una carpeta sin nombre(me di cuenta despues que el nombre tenia un espacio si no me equivoco es un caracter que aparece cuando se presiona alt + 0160).

El problema ocurre con esa carpeta con nombre vacio ya que si le cambio de nombre de la carpeta la aplicacion funciona.

Aqui les dejo el codigo del boton buscar archivos:


Código
  1. 'BOTON BUSCAR ARCHIVOS
  2. Try
  3.            Dim RutaArchivos As String = "G:\"
  4.  
  5.            For Each archivo As String In My.Computer.FileSystem.GetFiles(RutaArchivos, FileIO.SearchOption.SearchAllSubDirectories, "*.docx")
  6.                ListView1.Items.Add(archivo)
  7.            Next
  8. For Each archivo2 As String In My.Computer.FileSystem.GetFiles(RutaArchivos, FileIO.SearchOption.SearchAllSubDirectories, "*.pptx")
  9.                ListView1.Items.Add(archivo2)
  10.            Next
  11.        Catch ex As Exception
  12.            MessageBox.Show(ex.Message)
  13.        End Try

Si alguien podria ayudarme a solucionarlo, se lo agradeceria mucho.



En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Problemas a listar Archivos
« Respuesta #1 en: 3 Febrero 2015, 19:42 pm »

estaban ocultos los archivos y crei que igual deberia listar los archivos sin importar los atributos de oculto

Efectivamente, la función GetFiles lista los archivos sin importar sus atributos.

No es necesario realizar cambios, aunque debo decir que para simplificar el código puedes utilizar el overload del método My.Computer.FileSystem.GetFiles que acepta un array de extensiones, en lugar de realizar dos búsquedas distintas como estás haciendo ...eso es algo innecesario:

Código
  1. Imports Microsoft.VisualBasic.FileIO
  2.  
  3. Public Class TestForm
  4.  
  5.    Private Sub TestForm_Shown() Handles MyBase.Shown
  6.  
  7.        Dim folderPath As String = "C:\"
  8.        Dim fileExts As IEnumerable(Of String) = {"*.docx", "*.pptx"}
  9.        Dim filePaths As IEnumerable(Of String)
  10.        Dim lvItems As IEnumerable(Of ListViewItem)
  11.  
  12.        Try
  13.            filePaths = From filePath As String In My.Computer.FileSystem.GetFiles(folderPath,
  14.                                                                                   SearchOption.SearchAllSubDirectories,
  15.                                                                                   fileExts.ToArray)
  16.        Catch ex As Exception
  17.            Throw
  18.  
  19.        End Try
  20.  
  21.        lvItems = From filePath As String In filePaths
  22.                  Select New ListViewItem(filePath)
  23.  
  24.        With Me.ListView1
  25.            .BeginUpdate()
  26.            .Items.AddRange(lvItems.ToArray)
  27.            .EndUpdate()
  28.        End With
  29.  
  30.    End Sub
  31.  
  32. End Class


Aunque realmente deberías utilizar el método Directory.GetFiles en lugar de usar los métodos del namespace My, el cual carece del overload para asignar múltiples extensiones, pero sigue siendo mejor, ejemplo:

Código
  1. Imports System.IO
  2.  
  3. Public Class TestForm
  4.  
  5.    Private Sub TestForm_Shown() Handles MyBase.Shown
  6.  
  7.        Dim folderPath As String = "C:\"
  8.        Dim fileExts As IEnumerable(Of String) = {"docx", "pptx"}
  9.        Dim fInfoCol As IEnumerable(Of FileInfo)
  10.        Dim lvItems As IEnumerable(Of ListViewItem)
  11.  
  12.        Try
  13.            fInfoCol = GetFiles(folderPath, fileExts, SearchOption.AllDirectories)
  14.  
  15.        Catch ex As Exception
  16.            Throw
  17.  
  18.        End Try
  19.  
  20.        lvItems = From fInfo As FileInfo In fInfoCol
  21.                  Select New ListViewItem(fInfo.FullName)
  22.  
  23.        With Me.ListView1
  24.            .BeginUpdate()
  25.            .Items.AddRange(lvItems.ToArray)
  26.            .EndUpdate()
  27.        End With
  28.  
  29.    End Sub
  30.  
  31.    ''' <summary>
  32.    ''' Retrieves the files inside a directory,
  33.    ''' containing the specified file extensions.
  34.    ''' </summary>
  35.    ''' <param name="folderPath">The directory path where to search files.</param>
  36.    ''' <param name="fileExts">The file extensions to match.</param>
  37.    ''' <param name="searchOption">The searching mode.</param>
  38.    ''' <returns>IEnumerable(Of FileInfo).</returns>
  39.    Public Shared Function GetFiles(ByVal folderPath As String,
  40.                                    ByVal fileExts As IEnumerable(Of String),
  41.                                    ByVal searchOption As SearchOption) As IEnumerable(Of FileInfo)
  42.  
  43.        ' Set all the file extensions to lower-case and
  44.        ' Remove empty file extensions and
  45.        ' Remove "*" and "." chars from beginning of the file extension.
  46.        fileExts = From fileExt As String In fileExts
  47.                   Where Not String.IsNullOrEmpty(fileExt)
  48.                   Select fileExt.TrimStart({"*"c, "."c, " "c}).TrimEnd.ToLower
  49.  
  50.        Return From filePath As String In Directory.GetFiles(folderPath, "*", searchOption)
  51.               Where If(Not String.IsNullOrEmpty(Path.GetExtension(filePath)),
  52.                        fileExts.Contains(Path.GetExtension(filePath).TrimStart("."c).ToLower),
  53.                        Nothing)
  54.               Select New FileInfo(filePath)
  55.  
  56.    End Function
  57.  
  58. End Class



Sobre el problema en cuestión, el método que te da error lo hace por causa de un desbordamiento de la pila, el motivo no lo se, no debería suceder, seguramente el caracter que has comentado esté implicado en el error al ser un caracter ilegal para una carpeta y una vulnerabilidad de la que algunos virus se aprovechan, eso es lo que puede estar ocasionando dicho desbordamiento de alguna manera, el reconocimiento de esa carpeta.

¿No puedes simplemente renombrar la carpeta a otro nombre?.

Saludos


« Última modificación: 3 Febrero 2015, 20:09 pm por Eleкtro » En línea

OscarCadenas_91

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Problemas a listar Archivos
« Respuesta #2 en: 3 Febrero 2015, 20:20 pm »

Hola, gracias por responder y gracias por la sugerencia de Directory.GetFiles
eh intentado probar tu codigo, pero me marca un error:
'ToArray' no es un miembro de 'System.Collections.generic.IEnumerable(Of String)'
en esta linea:
 filePaths = From filePath As String In My.Computer.FileSystem.GetFiles(folderPath,
                                                                                   SearchOption.SearchAllSubDirectories,
                                                                                  fileExts.ToArray)


Solucione eso, estaba con .netframework 2 actualice a .netramework 4.5.1


Sobre lo de Renombrar el nombre de la carpeta, lo eh intentado, asì:
Código
  1.  My.Computer.FileSystem.RenameDirectory("G:\" & " ", "Carpeta2")



Pero no reconoce el nombre de la carpeta y lo toma como si solo estuviese escrito "G:\"

manualmente se puede renombrar, pero desde vb.net nada, no existe alguna otra forma??


« Última modificación: 3 Febrero 2015, 20:36 pm por OscarCadenas_91 » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Problemas a listar Archivos
« Respuesta #3 en: 3 Febrero 2015, 21:04 pm »

Sobre lo de Renombrar el nombre de la carpeta, lo eh intentado, asì:
Código
  1.  My.Computer.FileSystem.RenameDirectory("G:\" & " ", "Carpeta2")

Claro que no lo reconoce, estás usando un caracter de espacio, no el caracter Unicode que has comentado.

Pero a lo que me refiero es que renombres la carpeta desde el Explorer, de forma manual.
¿Porque lo quieres renombrar desde Vb.Net? (utiliza el nombre real de la carpeta para renombrarla)

saludos
« Última modificación: 3 Febrero 2015, 21:08 pm por Eleкtro » En línea

OscarCadenas_91

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Problemas a listar Archivos
« Respuesta #4 en: 3 Febrero 2015, 22:25 pm »

una tonteria mia, lo de no poner el valor unicode de ese caracter: "NO-BREAK SPACE" U+00A0-> (&HA0), pero igual no daba.

Lo queria hacer desde vb.net de forma automatica sin estar yendo a las propiedades del explorer,carpetas ocultas,ver la carpeta, etc, ya que cuando estaba en otras maquinas no se podia quitar los atributos de oculto y por tanto no se podia ver la carpeta en cuestion.

Encontre una forma, no se si la mejor, pero funciono:
Código
  1. Shell("cmd.exe /c move /-y " & """" & "G:\" & ChrW(&HA0) & """" & " G:\Recuperado")
  2.  
Ahora solo me falta hacer es que si existe esa carpeta lo cambie de nombre, caso contrario omita ese paso xD.

Gracias por la ayuda, saludos.
« Última modificación: 3 Febrero 2015, 22:39 pm por OscarCadenas_91 » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Problemas a listar Archivos
« Respuesta #5 en: 4 Febrero 2015, 02:44 am »

Código
  1. Shell("cmd.exe /c move /-y " & """" & "G:\" & ChrW(&HA0) & """" & " G:\Recuperado")

Buf...! Queda totalmente prohibido a partir de hoy utilizar Batch bajo .Net en este foro.

No, en serio, no utilices herramientas primitivas como la consola de Windows + comandos de Batch, es innecesario y no te aporta ningún control sobre dicha acción, prueba así:

Código
  1. Imports System.IO

Código
  1. Dim sourceFolder As String = Path.Combine("C:\", Convert.ToChar(160))
  2. Dim destinyFolder As String = Path.Combine("C:\", "Recuperado")
  3.  
  4. Try
  5.    Directory.CreateDirectory(sourceFolder) ' Creo la carpeta para reproducir el problema que has descrito.
  6.  
  7.    If Directory.Exists(sourceFolder) Then ' Si el directorio existe...
  8.        ' Lo muevo.
  9.        Directory.Move(sourceFolder, destinyFolder)
  10.    End If
  11.  
  12. Catch ex As Exception
  13.    Throw
  14.  
  15. End Try

saludos
« Última modificación: 4 Febrero 2015, 02:50 am por Eleкtro » En línea

OscarCadenas_91

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Problemas a listar Archivos
« Respuesta #6 en: 4 Febrero 2015, 06:13 am »

gracias por todo, aun me falta mucho por aprender.

Sobre lo de intentar reproducir el problema con:

Código
  1. Directory.CreateDirectory(sourceFolder)

No crea el directorio con ese caracter y tambien lo de si existe esa ruta tampoco funciona(supongo que debe ser por ese caracter).

Lo que si funciona es:
Código
  1. Directory.Move(sourceFolder, DestinyFolder)

Ya estaba pensando en usar el "On Error Resume Next", pero decidi hacerlo asi:

Código
  1.   Private Sub TestForm_Shown() Handles MyBase.Shown
  2.        Dim sourceFolder As String = Path.Combine("G:\", Convert.ToChar(160))
  3.        Dim DestinyFolder As String = Path.Combine("G:\", "Recuperado")
  4.        Try
  5.            Directory.Move(sourceFolder, DestinyFolder)
  6.        Catch ex As Exception
  7.  
  8.        Finally
  9.            Dim folderPath As String = "G:\"
  10.            Dim fileExts As IEnumerable(Of String) = {"docx", "pptx"}
  11.            Dim fInfoCol As IEnumerable(Of FileInfo)
  12.            Dim lvItems As IEnumerable(Of ListViewItem)
  13.  
  14.            Try
  15.                fInfoCol = GetFiles(folderPath, fileExts, SearchOption.AllDirectories)
  16.  
  17.            Catch ex As Exception
  18.                Throw
  19.  
  20.            End Try
  21.  
  22.            lvItems = From fInfo As FileInfo In fInfoCol
  23.                      Select New ListViewItem(fInfo.FullName)
  24.  
  25.            With Me.ListView1
  26.                .BeginUpdate()
  27.                .Items.AddRange(lvItems.ToArray)
  28.                .EndUpdate()
  29.            End With
  30.        End Try
  31.    End Sub
  32.  
  33.    ''' <summary>
  34.    ''' Retrieves the files inside a directory,
  35.    ''' containing the specified file extensions.
  36.    ''' </summary>
  37.    ''' <param name="folderPath">The directory path where to search files.</param>
  38.    ''' <param name="fileExts">The file extensions to match.</param>
  39.    ''' <param name="searchOption">The searching mode.</param>
  40.    ''' <returns>IEnumerable(Of FileInfo).</returns>
  41.    Public Shared Function GetFiles(ByVal folderPath As String,
  42.                                    ByVal fileExts As IEnumerable(Of String),
  43.                                    ByVal searchOption As SearchOption) As IEnumerable(Of FileInfo)
  44.  
  45.        ' Set all the file extensions to lower-case and
  46.        ' Remove empty file extensions and
  47.        ' Remove "*" and "." chars from beginning of the file extension.
  48.        fileExts = From fileExt As String In fileExts
  49.                   Where Not String.IsNullOrEmpty(fileExt)
  50.                   Select fileExt.TrimStart({"*"c, "."c, " "c}).TrimEnd.ToLower
  51.  
  52.        Return From filePath As String In Directory.GetFiles(folderPath, "*", searchOption)
  53.               Where If(Not String.IsNullOrEmpty(Path.GetExtension(filePath)),
  54.                        fileExts.Contains(Path.GetExtension(filePath).TrimStart("."c).ToLower),
  55.                        Nothing)
  56.               Select New FileInfo(filePath)
  57.  
  58.    End Function
  59.  


Asi me funciona, si sigo estoy equivocado corrigeme

Saludos



« Última modificación: 4 Febrero 2015, 06:19 am por OscarCadenas_91 » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Problemas a listar Archivos
« Respuesta #7 en: 4 Febrero 2015, 15:24 pm »

No crea el directorio con ese caracter y tambien lo de si existe esa ruta tampoco funciona(supongo que debe ser por ese caracter).

En mi caso si que me crea correctamente la carpeta con dicho caracter, no se me ocurre porque motivo a ti no funciona. ¿la instrucción no lanza ninguna excepción?, en caso afirmativo, ¿cual es el mensaje de error y el stack trace?.



Asi me funciona, si sigo estoy equivocado corrigeme

Hombre, un bloque try/catch anidado dentro de un bloque finally no es muy buena idea, el bloque finally contiene el código que será evaluado en todas las condiciones ocurra o no ocurra una excepción, puedes utilizarlo como un "On Error Resume Next", pero el bloque finally no se suele usar con la finalidad que le estás dando, sino más bien para hacer una limpieza, un cleanup, por ejemplo para asegurarse de liberar los recursos usados por objetos disposables:

Código
  1. ' Un objeto disposable cualquiera.
  2. Dim obj As MemoryStream
  3.  
  4. Try
  5.    ' Instancio la class disposable.
  6.    obj = New MemoryStream
  7.    ' Intento leer un bloque de bytes en un buffer vacío, dará error.
  8.    obj.Read(New Byte() {}, 0, 1)
  9.    ' Las instrucciones de abajo no se procesarán ya que terminó la ejecución de este bloque debido al error.
  10.    obj.Flush()
  11.    obj.Close()
  12.  
  13. Catch ex As Exception
  14.    ' Controlar la excepción.
  15.    MsgBox(ex.Message)
  16.  
  17. Finally
  18.    ' Asegurarse de liberar los recursos del objeto, se haya controlado o no la excepción.
  19.    If obj IsNot Nothing Then
  20.        obj.Flush()
  21.        obj.Close()
  22.    End If
  23.  
  24. End Try

El código que has mostrado, yo lo dejaría así:
EDITO: Bueno, también debo decir que la función GetFiles como ves devuelve una colección de objetos FileInfo, si no necesitas ningún dato más que la ruta del archivo entonces se puede simplificar bastante más para evitar algunas sentencias de LINQ innecesarias.

Código
  1.        Dim folderPath As String = "G:\"
  2.        Dim sourceFolder As String = Path.Combine(folderPath, Convert.ToChar(160))
  3.        Dim destinyFolder As String = Path.Combine(folderPath, "Recuperado")
  4.        Dim fileExts As IEnumerable(Of String) = {"docx", "pptx"}
  5.        Dim fInfoCol As IEnumerable(Of FileInfo)
  6.        Dim lvItems As ListViewItem()
  7.  
  8.        Try
  9.            Directory.Move(sourceFolder, destinyFolder)
  10.        Catch ' Omito cualquier excepción.
  11.        End Try
  12.  
  13.        Try
  14.            fInfoCol = GetFiles(folderPath, fileExts, SearchOption.AllDirectories)
  15.        Catch ' Omito cualquier excepción.
  16.        End Try
  17.  
  18.        lvItems = (From fInfo As FileInfo In fInfoCol
  19.                   Select New ListViewItem(fInfo.FullName)).ToArray
  20.  
  21.        With Me.ListView1
  22.            .BeginUpdate()
  23.            .Items.AddRange(lvItems)
  24.            .EndUpdate()
  25.        End With
  26.  
  27.    ''' <summary>
  28.   ''' Retrieves the files inside a directory,
  29.   ''' containing the specified file extensions.
  30.   ''' </summary>
  31.   ''' <param name="folderPath">The directory path where to search files.</param>
  32.   ''' <param name="fileExts">The file extensions to match.</param>
  33.   ''' <param name="searchOption">The searching mode.</param>
  34.   ''' <returns>IEnumerable(Of FileInfo).</returns>
  35.   Public Shared Function GetFiles(ByVal folderPath As String,
  36.                                   ByVal fileExts As IEnumerable(Of String),
  37.                                   ByVal searchOption As SearchOption) As IEnumerable(Of FileInfo)
  38.  
  39.       ' Set all the file extensions to lower-case and
  40.       ' Remove empty file extensions and
  41.       ' Remove "*" and "." chars from beginning of the file extension.
  42.       fileExts = From fileExt As String In fileExts
  43.                  Where Not String.IsNullOrEmpty(fileExt)
  44.                  Select fileExt.TrimStart({"*"c, "."c, " "c}).TrimEnd.ToLower
  45.  
  46.       Return From filePath As String In Directory.GetFiles(folderPath, "*", searchOption)
  47.              Where If(Not String.IsNullOrEmpty(Path.GetExtension(filePath)),
  48.                       fileExts.Contains(Path.GetExtension(filePath).TrimStart("."c).ToLower),
  49.                       Nothing)
  50.              Select New FileInfo(filePath)
  51.  
  52.   End Function

saludos
« Última modificación: 4 Febrero 2015, 15:27 pm por Eleкtro » En línea

OscarCadenas_91

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Problemas a listar Archivos
« Respuesta #8 en: 4 Febrero 2015, 16:22 pm »

Ok guardado todo lo que me dices, sobre lo de finally.  :P

sobre lo de crear esa carpeta, sin colocarlo en un bloque try/catch, abre y se cierra.
Bajo el bloque Try/Catch, me manda este error:

Código:
Excepción:Se produjo: "No se puede encontrar una parte de la ruta de acceso 'G:\'." (System.IO.DirectoryNotFoundException)
Se produjo una System.IO.DirectoryNotFoundException: "No se puede encontrar una parte de la ruta de acceso 'G:\'."

Mi USB esta formateado en Fat32, en un disco duro formateado en NTFS no muestra error ni tampoco se cierra.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Problemas a listar Archivos
« Respuesta #9 en: 4 Febrero 2015, 22:28 pm »

Quizás esto te pueda ayudar, porque yo no dispongo ahora mismo de ninguna partición FAT32 para probar los nombres:
http://stackoverflow.com/questions/19503697/unicode-filenames-on-fat-32

¿Como solucionarlo?, ...pues sinceramente, a parte de darle un formato NTFS al dispositivo USB, ni idea.

Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listar Archivos Mp3 Mediante Tag
.NET (C#, VB.NET, ASP)
rob1104 1 3,447 Último mensaje 9 Abril 2008, 06:42 am
por BADBYTE-K
Listar y borrar archivos en C
Programación C/C++
Fastolfe 2 3,749 Último mensaje 25 Agosto 2011, 00:14 am
por Fastolfe
Listar archivos
GNU/Linux
huerto123 4 2,729 Último mensaje 1 Febrero 2014, 20:53 pm
por huerto123
listar archivos
ASM
bengy 4 2,977 Último mensaje 2 Junio 2014, 23:19 pm
por Eternal Idol
Listar archivos dia actual
Hacking
tricampeon81 3 3,730 Último mensaje 15 Agosto 2014, 04:30 am
por scott_
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines