[RETO] Obtener nombre de archivo

Iniciado por Psyke1, 13 Febrero 2011, 19:54 PM

0 Miembros y 3 Visitantes están viendo este tema.

Psyke1

Un reto fácil, en el que creo que puede participar mucha gente. :)
Consiste en obtener el nombre de archivo a partir de una ruta, así:

C:\Documents and Settings\Llamazares\Mis documentos\Downloads\SexoDeRanas.avi
Deberia devolver la función:
SexoDeRanas.avi

Quien sea más rápido, gana. ;)
Se testeará con cFrogContest.cls :P

DoEvents! :P

ignorantev1.1

Código (vb) [Seleccionar]
Function getFileName(ByVal path As String) As String
    Dim cM As Integer
    cM = InStrRev(path, "\") + 1
    If cM = 0 Then Exit Function
    getFileName = Mid(path, cM)
End Function

seba123neo

Código (vb) [Seleccionar]
Private Declare Sub PathStripPath Lib "shlwapi.dll" Alias "PathStripPathA" (ByVal pszPath As String)

Public Function StripPath(ByVal sPath As String) As String
   Call PathStripPath(sPath)
   StripPath = sPath
End Function
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

seba123neo

la api es una de las mas compactas, pero es la mas lenta, aca paso una optimizacion de la que puso ignorantev1.1 , es unos 300 milisegundos mas rapida.

Código (vb) [Seleccionar]
Function getFileName(ByVal path As String) As String
    getFileName = Mid$(path, InStrRev(path, "\") + 1)
End Function
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

79137913

HOLA!!!

No tengo el VB aca asi que solo dejo el codigo(sin testear):
Código (vb) [Seleccionar]

Private Declare Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer

Private Function Fn7913(sPath As String) As String
     Dim Mem As String
     Mem = String(255, 0)
     GetFileTitle sPath, Mem, 255
     Fn7913 = Trim(Mem)
End Function


GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

grester43hck

#5
Código (vb) [Seleccionar]
Function nombre_archivo(ByVal Ruta As String) As String
Dim partes() As String
partes = Split(Ruta, "\")
nombre_archivo = partes(UBound(partes))
End Function


Seguramente no es la mas rapida ni por asomo xD

seba123neo

Cita de: grester43hck en 13 Febrero 2011, 20:55 PM
Seguramente no es la mas rapida ni por asomo xD

no, es lentisima  ;D

las 2 mas rapidas hasta ahora es la segunda que puse yo y la de 79137913, a veces una dura mas y la otra menos, esta en la pelea.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

ignorantev1.1

Esta pregunta la he hecho unas 450 veces pero se me olvida  :-[

Como medimos la velocidad?

@seba123neo
Jajajajaja te barriste con tu segunda funcion  ;-)

Psyke1

#8
La mía:
Código (vb) [Seleccionar]

Public Static Function GetFileMrFrog(ByRef sFile As String) As String
    GetFileMrFrog = RightB$(sFile, LenB(sFile) - InStrB(sFile, "\") - 1)
End Function


@ignorantev1.1
http://foro.elhacker.net/programacion_visual_basic/src_cfrogcontestcls_by_mr_frog_copy-t318871.0.html

DoEvents! :P

seba123neo

#9
con la clase CTiming, la podes bajar de aca:

CTiming

aca va el codigo, con las funciones posteadas hasta ahora. pongan un boton en el form y este codigo.

Código (vb) [Seleccionar]
Option Explicit

Private CTiming As CTiming

Private Declare Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer
Private Declare Sub PathStripPath Lib "shlwapi.dll" Alias "PathStripPathA" (ByVal pszPath As String)

Const Path As String = "C:\Documents and Settings\Llamazares\Mis documentos\Downloads\SexoDeRanas.avi"

Dim i As Long
Dim ValTest As Long
Dim vres As String

Private Sub Command1_Click()
    Me.Print "Test de velocidad" & vbCrLf
   
    ValTest = 10000
   
    CTiming.Reset
   
    For i = 0 To ValTest
        vres = StripPath(Path)
    Next
   
    Me.Print "seba123neo api: " & CTiming.sElapsed
   
    CTiming.Reset
   
    For i = 0 To ValTest
        vres = GetFileName(Path)
    Next
   
    Me.Print "ignorantev1.1: " & CTiming.sElapsed
   
    CTiming.Reset
   
    For i = 0 To ValTest
        vres = getFileName2(Path)
    Next
   
    Me.Print "seba123neo (ignorantev1.1): " & CTiming.sElapsed
   
    CTiming.Reset
   
    For i = 0 To ValTest
        vres = Fn7913(Path)
    Next
   
    Me.Print "79137913: " & CTiming.sElapsed
   
    CTiming.Reset
   
    For i = 0 To ValTest
        vres = nombre_archivo(Path)
    Next
   
    Me.Print "grester43hck: " & CTiming.sElapsed
   
    CTiming.Reset
   
    For i = 0 To ValTest
        vres = GetFileMrFrog(Path)
    Next
   
    Me.Print "Mr. Frog ©: " & CTiming.sElapsed
   
    CTiming.Reset
   
    For i = 0 To ValTest
        vres = GetFileName123(Path)
    Next
   
    Me.Print "seba123neo (segunda): " & CTiming.sElapsed
   
    CTiming.Reset
   
    For i = 0 To ValTest
        vres = SacarFilenameE_C(Path)
    Next
   
    Me.Print "Elemental Code: " & CTiming.sElapsed
   
    CTiming.Reset
   
    For i = 0 To ValTest
        vres = SacarFilenameE_Cv2(Path)
    Next
   
    Me.Print "Elemental Code 2: " & CTiming.sElapsed
   
End Sub

Private Sub Form_Load()
    Set CTiming = New CTiming
    Me.AutoRedraw = True
End Sub

Private Function StripPath(ByVal sPath As String) As String
   Call PathStripPath(sPath)
   StripPath = sPath
End Function

Private Function getFileName2(ByVal Path As String) As String
    getFileName2 = Mid$(Path, InStrRev(Path, "\") + 1)
End Function

Private Function GetFileName(ByVal Path As String) As String
    Dim cM As Integer
    cM = InStrRev(Path, "\") + 1
    If cM = 0 Then Exit Function
    GetFileName = Mid(Path, cM)
End Function

Private Function Fn7913(ByVal sPath As String) As String
    Dim Buffer As String
    Buffer = String(255, 0)
    GetFileTitle sPath, Buffer, Len(Buffer)
    Fn7913 = Left$(Buffer, InStr(1, Buffer, Chr$(0)) - 1)
End Function

Private Function nombre_archivo(ByVal Ruta As String) As String
    Dim partes() As String
    partes = Split(Ruta, "\")
    nombre_archivo = partes(UBound(partes))
End Function

Public Static Function GetFileMrFrog(ByRef sFile As String) As String
    GetFileMrFrog = RightB$(sFile, LenB(sFile) - InStrB(sFile, "\") - 1)
End Function

Public Function GetFileName123(ByRef vPath As String) As String
    GetFileName123 = Right$(vPath, Len(vPath) - InStrRev(vPath, "\"))
End Function

Public Function SacarFilenameE_C(ByRef sPath As String) As String
    SacarFilenameE_C = StrReverse(Left(StrReverse(sPath), InStr(1, StrReverse(sPath), "\", vbBinaryCompare) - 1))
End Function

Public Function SacarFilenameE_Cv2(ByRef sPath As String) As String
    SacarFilenameE_Cv2 = Right(sPath, Len(sPath) - InStrRev(sPath, "\", Len(sPath), vbBinaryCompare))
End Function


PD: no vi que era con la clase modificada de Mr. Frog © , pero me imagino que no hay diferencia no ?

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson