Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#8731
Citar

Si no recuerdo mal creo que ese efecto se denomina "Bubble Fish" o "Eye Fish" (Ojo de péz),
lo puedes hacer como te ha dicho syntax error.

Solo tienes que averiguar el índice de la que es la imágen "central", porque si no la identificas primero, no puedes hacer nada, y entonces ya con esa imágen haces lo que prefieras, o bien usar eventos (mouse hover) para agrandar la imágen cuando se pase el ratón por la imágen, o bien mantenerla agrandada permanéntemente.

Saludos
#8732
Otro código de ORO:

Devuelve de la manera más eficaz y sencilla una lista de tipo FileInfo con todos los archivos de un directorio,
Le hice dos overloads para poder usar la función de varias maneras y evitar posibles errores en el "SearchPattern",
La función es "IgnoreCase", devuelve la extensión en uppercase y lowercase y todas las variantes posibles, en fin, esto es la perfección:

Código (vbnet) [Seleccionar]
#Region " Get Files "

   ' [ Get Files Function ]
   '
   ' // By Elektro H@cker
   '
   ' Examples :
   '
   ' For Each file In Get_Files("C:\Windows", False) : MsgBox(file.Name) : Next
   '
   ' For Each file In Get_Files("C:\Windows", True, "dll")   : MsgBox(file.Name) : Next
   ' For Each file In Get_Files("C:\Windows", True, ".dll")  : MsgBox(file.Name) : Next
   ' For Each file In Get_Files("C:\Windows", True, "*.dll") : MsgBox(file.Name) : Next
   '
   ' For Each file In Get_Files("C:\Windows", False, {"dll", "ini"})     : MsgBox(file.Name) : Next
   ' For Each file In Get_Files("C:\Windows", False, {".dll", ".ini"})   : MsgBox(file.Name) : Next
   ' For Each file In Get_Files("C:\Windows", False, {"*.dll", "*.ini"}) : MsgBox(file.Name) : Next

   ' Get Files {directory} {recursive}
   Private Function Get_Files(ByVal directory As String, ByVal recursive As Boolean) As List(Of IO.FileInfo)
       Dim searchOpt As IO.SearchOption = If(recursive, IO.SearchOption.AllDirectories, IO.SearchOption.TopDirectoryOnly)
       Return IO.Directory.GetFiles(directory, "*", searchOpt).Select(Function(p) New IO.FileInfo(p)).ToList
   End Function

   ' Get Files {directory} {recursive} {ext}
   Private Function Get_Files(ByVal directory As String, ByVal recursive As Boolean, ext As String) As List(Of IO.FileInfo)

       If ext.StartsWith("*") Then
           ext = ext.Substring(1, ext.Length - 1)
       ElseIf Not ext = "*" AndAlso Not ext.StartsWith(".") Then
           ext = ("." & ext)
       ElseIf ext = "*" Then
           ext = Nothing
       End If

       Dim searchOpt As IO.SearchOption = If(recursive, IO.SearchOption.AllDirectories, IO.SearchOption.TopDirectoryOnly)
       Return IO.Directory.GetFiles(directory, "*" & ext, searchOpt).Select(Function(p) New IO.FileInfo(p)).ToList

   End Function

   ' Get Files {directory} {recursive} {exts()}
   Private Function Get_Files(ByVal directory As String, ByVal recursive As Boolean, ParamArray exts() As String) As List(Of IO.FileInfo)

       Dim FileExts(exts.Count) As String
       Dim ExtCount As Int32 = 0

       For Each ext In exts
           If ext.StartsWith("*") Then
               FileExts(ExtCount) = ext.Substring(1, ext.Length - 1)
           ElseIf Not ext = "*" AndAlso Not ext.StartsWith(".") Then
               FileExts(ExtCount) = ("." & ext)
           ElseIf Not ext = "*" AndAlso ext.StartsWith(".") Then
               FileExts(ExtCount) = ext
           ElseIf ext = "*" Then
               FileExts(ExtCount) = Nothing
           End If
           ExtCount += 1
       Next

       Dim searchOpt As IO.SearchOption = If(recursive, IO.SearchOption.AllDirectories, IO.SearchOption.TopDirectoryOnly)
       Dim filenameExtComparer As New FilenameExtensionComparer
       Return IO.Directory.GetFiles(directory, "*", searchOpt).Where(Function(o) FileExts.Contains(IO.Path.GetExtension(o), filenameExtComparer)).Select(Function(p) New IO.FileInfo(p)).ToList

   End Function

   ' FilenameExtensionComparer
   Public Class FilenameExtensionComparer : Implements IEqualityComparer(Of String)

       Public Function Equals1(s As String, t As String) As Boolean Implements IEqualityComparer(Of String).Equals
           Return String.Compare(s, t, StringComparison.OrdinalIgnoreCase) = 0
       End Function

       Public Function GetHashCode1(s As String) As Integer Implements IEqualityComparer(Of String).GetHashCode
           Return s.GetHashCode()
       End Function

   End Class

#End Region
#8733
perdón, lo escribí al vuelo y cometí un misstype, símplemente añade un SET /A aquí:
set /A num+=1

PD: La costumbre de no usar keywords a la izquierda de las variables en otros lenguajes cada vez se apodera más de mi xD.

Cita de: Ikillnukes en 11 Junio 2013, 07:32 AM
Error:

Código (dos) [Seleccionar]

Ya existe un archivo con el mismo nombre
o no se ha encontrado el archivo.


Ese error que comentas es "normal", si ya tienes un archivo que se llama "1.png" no se puede renombrar al mismo nombre y el bat fallará con ese archivo, pero nada grave.

Saludos
#8734
Bueno, de todas formas ya he codeado la función para hacerlo añadiendo los Ceros xD.
http://foro.elhacker.net/net/pequena_duda_con_un_string-t392198.0.html;msg1860018#msg1860018

Si lo quieres hacer en Batch (sin incrementar por "ceros") entonces el código no requiere esfuerzo:

@Echo off
setlocal enabledelayedexpansion

For %%# in ("X:\carpeta\*.png") Do (
   set /A num+=1
   Ren "%%#" "!num!.%%~x#"
)


Saludos
#8735
@Seazoux:

Código (vbnet) [Seleccionar]
#Region " Rename Files (Increment method) "

    ' [ Rename Files (Increment method) ]
    '
    ' // By Elektro H@cker
    '
    ' Examples :
    ' Rename_Files_By_Increment("C:\", "jpg") ' Result: 001.jpg, 002.jpg
    ' Rename_Files_By_Increment("C:\")        ' Result: 001.jpg, 002.dll

    Private Sub Rename_Files_By_Increment(ByVal Dir As String, Optional ByVal FileExt As String = "*")

        Dim FileList As List(Of IO.FileInfo)

        If Not FileExt = "*" _
        AndAlso Not FileExt.StartsWith(".") _
        Then FileExt = ("." & FileExt)

        Select Case FileExt
            Case "*" : FileList = IO.Directory.GetFiles(Dir, "*", IO.SearchOption.TopDirectoryOnly).Select(Function(p) New IO.FileInfo(p)).ToList
            Case Else : FileList = IO.Directory.GetFiles(Dir, "*" & FileExt, IO.SearchOption.TopDirectoryOnly).Select(Function(p) New IO.FileInfo(p)).ToList
        End Select

        Dim ZeroCount As Int64 = FileList.Count.ToString.Length

        Dim FileName As String = String.Empty
        Dim Number As Int64 = 0

        Try

            For Each file In FileList

                Number += 1
                FileName &= Number

                For zero As Int64 = 0 To ZeroCount
                    If Not FileName.Length = ZeroCount Then
                        FileName = "0" & FileName
                    Else
                        Select Case FileExt
                            Case "*" : IO.File.Move(file.FullName, IO.Path.Combine(file.DirectoryName, FileName & file.Extension))
                            Case Else : IO.File.Move(file.FullName, IO.Path.Combine(file.DirectoryName, FileName & FileExt))
                        End Select
                        FileName = String.Empty
                        Exit For
                    End If
                Next

            Next

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

#End Region


;)
#8736
Lo primero de nada es que lo que quieres hacer se denomina Renombrabiento (Renombrar archivos), Y se puede hacer con el comando "Ren" (o "Rename", es lo mismo):
Código (vbnet) [Seleccionar]
Ren "Imágen.png" "001.png"

Lo que requieres se puede hacer, pero esto es Batch, requiere usar un poco de lógica, no es dificil pero llevaría bastante tiempo, ya que por cada X cantidad de archivos deberás usar X cantidad de ceros, por ejemplo:

menos de 10 archivos > 0.png
más de 10 archivos pero menos de 100 > 00.png
más de 100 archivos pero menos de 1000 > 000.png

Así que hay que escribir muchas condicionales en el código, y requiere su tiempo,
sincéramente, lo haría si fuese necesario, para algo soy moderador y sé Batch, pero en este caso no es necesario, lo considero perder el tiempo, ya que te recuerdo que estás en .NET, y con un "interop increment" y un par de select cases se hace bien rápido comparado con todo lo que hay que escribir en Batch.

EDITO: De hecho yo ya hice un Bat con ese tipo de renombrado, donde se detectaba la cantidad de ceros que habia que añadir a la izquierda de cada archivo a rneombrar según la cantidad total de archivos, pero no sé donde publiqué el código ni con que nombre, fue hace más de un año como mínimo xD.

PD: No te dejo "tirado",  voy a hacer un snippet para VBNET para hacer este tipo de renombrado.

Saludos!
#8737
@ElSevi

Lo cierto es que tenía pensado como idea trasladar ese Batch a código .NET para el concurso "EHN-DEV" de este año ya que dispongo de un método rapidísimo y el más eficiente para permutar caracteres, pero la verdad es que no me motiva mucho hacerlo porque a mi ya no me sirve ese tipo de aplicaciones de brute force para generar diccionarios y cosas parecidas, así que creo que para un concurso no lo voy a hacer, solo lo haría para los demás, en ratos libres, y de momento no es que tenga muchas ganas d ehacerlo...

No sé si lo haré, la verdad, pero de momento no tengo los suficientes motivos para hacerlo, a menos que me paguen por ello xD.

Saludos!
#8738
La verdad, la que estás liando en tu array de controles para hacer esto:

Código (vbnet) [Seleccionar]
       Dim pcb_(2) As PictureBox

       For pcb_num = 0 To pcb_.Length - 1
           pcb_(pcb_num) = New PictureBox
           pcb_(pcb_num).BackColor = Color.FromArgb(255, pcb_num * 3, pcb_num * 2, pcb_num)
           pcb_(pcb_num).Size = New Point(Panel1.Size.Width, Panel1.Size.Height \ 4)
           pcb_(pcb_num).Top = 90 * pcb_num
           pcb_(pcb_num).BackgroundImage = Image.FromFile(".\Art\im\image00" & pcb_num & ".png")
           Me.Panel1.Controls.Add(pcb_(pcb_num))
       Next


He visto tu pregunta Batchera... si el problema es que te acabas de dar cuenta que el array empieza por CERO en lugar de UNO y si símplemente quieres empezar desde el número "1" porque tus archivos empiezan con "001" pues modifica el "0" en el For por un "1" para saltar el primer item del array, y listo.

¿Es eso lo que pasa?

Saludos
#8739
Pues en teoría lo has concatenado corréctamente, ¿has probado a añadir un msgbox para comprobar que el archivo existe?...

Código (vbnet) [Seleccionar]
If Not IO.File.Exists(".\Art\im\image00" & pcb_num & ".png") then msgbox(""".\Art\im\image00" & pcb_num & ".png""" & " no existe") else msgbox ("si que existe")
pcb_(pcb_num).Image = Image.FromFile(".\Art\im\image00" & pcb_num & ".png")


PD: ¿Seguro que quieres usar la propiedad image en lugar de backgroundimage?

EDITO: el .parent los desubica dentro del panel, quita el .parent y añade los picboxes al panel diréctamente en lugar de añadirlos al form.

Saludos
#8740
Ahora sí, mejor imposible!, aquí tienen la forma más eficiente:

Código (vbnet) [Seleccionar]
   Private Function Get_Files(ByVal rootDirectory As String, ByVal recursive As Boolean, ParamArray exts() As String) As List(Of IO.FileInfo)
       Dim searchOpt As IO.SearchOption = If(recursive, IO.SearchOption.AllDirectories, IO.SearchOption.TopDirectoryOnly)
       Return IO.Directory.GetFiles(rootDirectory, "*.*", searchOpt).Where(Function(o) exts.Contains(IO.Path.GetExtension(o))).Select(Function(p) New IO.FileInfo(p)).ToList
   End Function


Ejemplo de uso:

Código (vbnet) [Seleccionar]
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       For Each file In Get_Files("C:\Windows", True, {".dll", "DLL"}) : MsgBox(file.Name) : Next
   End Sub


EDITO: Lo único imperfecto es que no es Ignore case, así que habría que usar la función así:
Código (vbnet) [Seleccionar]
For Each file In Get_Files("C:\Windows", True, {".dll", "DLL"}) : MsgBox(file.Name) : Next

;D