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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 [14] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ... 1236
131  Programación / .NET (C#, VB.NET, ASP) / Re: Librería de Snippets para VB.NET !! (Compartan aquí sus snippets) en: 28 Febrero 2024, 17:13 pm
Dos métodos que manipulan el registro de Windows. El primero sirve para crear una nueva entrada en el menú contextual del explorador de Windows al hacer click derecho sobre un tipo de archivo, lo que por lo general sirve para asociar un programa a un tipo/extensión de archivo y poder cargar el archivo haciendo click en esa entrada del menú contextual.

Y el segundo método sirve para borrar la entrada.

Nota: el primer método sirve para crear entradas individuales, no sirve para crear submenús.

Código
  1. ''' <summary>
  2. ''' Creates a registry key that represents a new entry in the Explorer's context-menu for the specified file type.
  3. ''' </summary>
  4. '''
  5. ''' <param name="fileType">
  6. ''' The file type (typically a file extension) for which to create the entry in the Explorer's context-menu.
  7. ''' </param>
  8. '''
  9. ''' <param name="keyName">
  10. ''' The name of the registry key.
  11. ''' </param>
  12. '''
  13. ''' <param name="text">
  14. ''' The display text for the entry in the Explorer's context-menu.
  15. ''' <para></para>
  16. ''' This value can be null, in which case <paramref name="keyName"/> will be used as text.
  17. ''' </param>
  18. '''
  19. ''' <param name="position">
  20. ''' The position of the entry in the Explorer's context-menu.
  21. ''' <para></para>
  22. ''' Valid values are: "top", "middle" and "bottom".
  23. ''' <para></para>
  24. ''' This value can be null.
  25. ''' </param>
  26. '''
  27. ''' <param name="icon">
  28. ''' The icon to show for the entry in the Explorer's context-menu.
  29. ''' <para></para>
  30. ''' This value can be null.
  31. ''' </param>
  32. '''
  33. ''' <param name="command">
  34. ''' The command to execute when the entry is clicked in the Explorer's context-menu.
  35. ''' </param>
  36. <DebuggerStepThrough>
  37. Public Shared Sub CreateFileTypeRegistryMenuEntry(fileType As String, keyName As String,
  38.                                                  text As String, position As String,
  39.                                                  icon As String, command As String)
  40.  
  41.    If String.IsNullOrWhiteSpace(fileType) Then
  42.        Throw New ArgumentNullException(paramName:=NameOf(fileType))
  43.    End If
  44.  
  45.    If String.IsNullOrWhiteSpace(keyName) Then
  46.        Throw New ArgumentNullException(paramName:=NameOf(keyName))
  47.    End If
  48.  
  49.    If String.IsNullOrWhiteSpace(command) Then
  50.        Throw New ArgumentNullException(paramName:=NameOf(command))
  51.    End If
  52.  
  53.    If String.IsNullOrEmpty(text) Then
  54.        text = keyName
  55.    End If
  56.  
  57.    Using rootKey As RegistryKey = Registry.ClassesRoot,
  58.          subKey As RegistryKey = rootKey.CreateSubKey($"{fileType}\shell\{keyName}", writable:=True),
  59.          subKeyCommand As RegistryKey = subKey.CreateSubKey("command", writable:=True)
  60.  
  61.        subKey.SetValue("", text, RegistryValueKind.String)
  62.        subKey.SetValue("icon", icon, RegistryValueKind.String)
  63.        subKey.SetValue("position", position, RegistryValueKind.String)
  64.  
  65.        subKeyCommand.SetValue("", command, RegistryValueKind.String)
  66.    End Using
  67.  
  68. End Sub

Código
  1. ''' <summary>
  2. ''' Deletes an existing registry key representing an entry in the Explorer's context-menu for the specified file type.
  3. ''' </summary>
  4. '''
  5. ''' <param name="fileType">
  6. ''' The file type associated with the registry entry.
  7. ''' </param>
  8. '''
  9. ''' <param name="keyName">
  10. ''' The name of the registry key to delete.
  11. ''' </param>
  12. '''
  13. ''' <param name="throwOnMissingsubKey">
  14. ''' Optional. If <see langword="True"/>, throws an exception if the registry key is not found.
  15. ''' <para></para>
  16. ''' Default value is <see langword="True"/>.
  17. ''' </param>
  18. <DebuggerStepThrough>
  19. Public Shared Sub DeleteFileTypeRegistryMenuEntry(fileType As String, keyName As String, Optional throwOnMissingsubKey As Boolean = True)
  20.  
  21.    If String.IsNullOrWhiteSpace(fileType) Then
  22.        Throw New ArgumentNullException(paramName:=NameOf(fileType))
  23.    End If
  24.  
  25.    If String.IsNullOrWhiteSpace(keyName) Then
  26.        Throw New ArgumentNullException(paramName:=NameOf(keyName))
  27.    End If
  28.  
  29.    Using rootKey As RegistryKey = Registry.ClassesRoot
  30.        rootKey.DeleteSubKeyTree($"{fileType}\shell\{keyName}", throwOnMissingsubKey)
  31.    End Using
  32.  
  33. End Sub
132  Foros Generales / Foro Libre / Re: ¡Que chulada lo que me comprado! en: 28 Febrero 2024, 17:05 pm
Hay que ver, no tenía ni idea de esos nombres, de lo que se entera uno...



Está bastante chula la bola. Pero solo has mencionado la de cuatro estrellas, me extraña que no las tengas todas... que a lo mejor si las tienes.

Si tuvieras las siete, quedarían muy bien juntitas de adorno en una plataforma a medida.

Mira esto:
 - https://es.aliexpress.com/item/1005006240162752.html
 - https://www.amazon.es/Laoji-Dragonball-drag%C3%B3n-estante-completo/dp/B0823ZX622 (también hay el mismo en AliExpress)

Es solo una idea. El tamaño de esas bolas son algo pequeñas (3,50 cm de diámetro).
133  Foros Generales / Foro Libre / Re: Whatsapp: ¿Puede una mafia de ciberestafadores hacer algo solo por haberles enviado un mensaje de texto? en: 28 Febrero 2024, 16:48 pm
No, con un mensaje no pueden hacer nada. Pero sí que pasas el primer filtro del ataque.
(...)
ni por enviar o recibir un Whatsapp, pueden llegar a vulnerarte.

Supongo que tendrás razón. Y probablemente haya sido eso, una simple prueba para pasar al siguiente nivel del ataque.

Gracias por tu respuesta. ;D



Por cierto, ¿nunca van a quitar los smileys navideños en el foro? xD
134  Foros Generales / Foro Libre / Whatsapp: ¿Puede una mafia de ciberestafadores hacer algo solo por haberles enviado un mensaje de texto? en: 28 Febrero 2024, 15:49 pm
Buenas tardes. En general uso Whatsapp poquísimo, y soy consciente de que un usuario o un hacker "normal" no tiene capacidad para hacer nada solo por escribirle un mensaje, pero tengo mis dudas en torno a las capacidades de las típicas mafias de ciberestafadores y etc que siempre están perfeccionando sus métodos...

¿El simple acto de enviar un mensaje de texto desde el teléfono móvil a la ventana de chat de un usuario de Whatsapp, es suficiente para que esa persona (suponiendo que sea un grupo de ciberestafadores) pueda causar un daño significativo a mi dispositivo o a mi directamente mediante el robo de información/contraseñas/cookies de mi teléfono?.

¿Ese tipo de mafias tienen la capacidad y los medios necesarios para poder acceder a mi teléfono solo por haberles enviado un mensaje de texto?.

Yo nunca respondo a mensajes sospechoso de scam, de esos que te piden o te ofrecen cosas absurdas (como premios y herencias xD) que claramente provienen de mafias de estafadores chinos, africanos o españoles, o mensajes en los que claramente se suplanta la identidad de otros servicios, como entidades bancarias y compañias. Directamente borro esos chats en cuanto los veo, y hago un bloqueo.

Pero hoy me ha llegado un mensaje que me ha hecho dudar un poco. La persona que me abrió chat me ha formulado una pregunta para saber si yo estaba interesado en una oferta de trabajo, y le he respondido de forma afirmativa, pero ya no me ha vuelto a responder esa persona. Y a los 10 minutos decidí borrar ese chat, pero no se si me habré puesto en riesgo solo por el acto de haber respondido.

Mi desconfianza y el hecho de que tras mi respuesta no me hayan respondido, me hace sospechar que a lo mejor solo buscaban eso, obtener un mensaje mío para poder hacer algo (algo perjudicial para mi) mediante ese mensaje.

¿Es eso posible para ese tipo de grupos organizados de hackers y estafadores, o no lo es?.

Aténtamente,
Elektro.
135  Foros Generales / Sugerencias y dudas sobre el Foro / Sección de Criptomonedas: Las Reglas en: 28 Febrero 2024, 14:42 pm
Buen día. Simplemente abro este hilo para sugerir que se formalice un hilo donde se establezcan las reglas para la sección de Criptomonedas: https://foro.elhacker.net/criptomonedas-b97.0/

Eso sería útil para entender cómo participar adecuadamente. ¿Qué tipo de contenido sería válido?. ¿Tutoriales, consejos de utilización para principiantes, consejos de inversión en general, noticias sobre eventos del mercado de criptomonedas?...

En definitiva, creo que sería buena idea unas normas para despejar las dudas. El resto de secciones suelen tener un hilo específico con las reglas exclusivas para dicha sección (ya sé que también se aplican las reglas generales del foro).

También me gustaría saber si existen planes para añadir más contenido a esa sección.

Aténtamente,
Elektro.
136  Programación / .NET (C#, VB.NET, ASP) / Re: Librería de Snippets para VB.NET !! (Compartan aquí sus snippets) en: 28 Febrero 2024, 13:07 pm
La siguiente función, por nombre "GetAssemblyNetTargetType", sirve para determinar si el tipo de un archivo de ensamblado es .NET Framework, .NET Standard o .NET Core.

Modo de empleo:
Código
  1. Dim assembly As Assembly = Assembly.LoadFile("C:\Assembly.dll")
  2. Dim assemblyType As NetTargetType = GetAssemblyNetTargetType(assembly)
  3. Console.WriteLine(assemblyType.ToString())

La función contiene tres validaciones diferentes, separadas por Regiones, aunque por lo general solamente se procesará el bloque de código de la primera validación.

Se ha diseñado así con la intención de funcionar correctamente en diversos escenarios, con errores esperados e inesperados de Reflection, y ya sea teniendo en cuenta si se usa esta función desde una aplicación .NET Framework, o .NET Core.

Código
  1. ''' <summary>
  2. ''' Specifies the type of a .NET assembly.
  3. ''' </summary>
  4. Public Enum NetTargetType
  5.    ''' <summary>
  6.    ''' An assembly that targets .NET Framework.
  7.    ''' </summary>
  8.    NetFramework
  9.  
  10.    ''' <summary>
  11.    ''' An assembly that targets .NET Standard.
  12.    ''' </summary>
  13.    NetStandard
  14.  
  15.    ''' <summary>
  16.    ''' An assembly that targets .NET Core.
  17.    ''' </summary>
  18.    NetCore
  19. End Enum

Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Determines whether the specified assembly ia a .NET Framework, .NET Standard or .NET Core assembly.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <returns>
  7. ''' A <see cref="NetTargetType"/> value that indicates the type of assembly.
  8. ''' </returns>
  9. ''' ----------------------------------------------------------------------------------------------------
  10. <DebuggerStepThrough>
  11. Public Shared Function GetAssemblyNetTargetType(assembly As Assembly) As NetTargetType
  12.  
  13. #Region " Primary validation "
  14.    Dim parimaryValidationException As Exception = Nothing
  15.  
  16.    Dim attrib As TargetFrameworkAttribute
  17.    Try
  18.        attrib = assembly.GetCustomAttributes.OfType(Of TargetFrameworkAttribute).SingleOrDefault()
  19.        If attrib?.FrameworkName.StartsWith(".NETFramework", StringComparison.OrdinalIgnoreCase) Then
  20.            Return NetTargetType.NetFramework
  21.  
  22.        ElseIf attrib?.FrameworkName.StartsWith(".NETStandard", StringComparison.OrdinalIgnoreCase) Then
  23.            Return NetTargetType.NetStandard
  24.  
  25.        ElseIf attrib?.FrameworkName.StartsWith(".NETCore", StringComparison.OrdinalIgnoreCase) Then
  26.            Return NetTargetType.NetCore
  27.  
  28.        Else
  29.            Throw New NotImplementedException($"Cannot determine type of {NameOf(TargetFrameworkAttribute)}.")
  30.  
  31.        End If
  32.  
  33.    Catch ex As FileNotFoundException When ex.FileName.StartsWith("System.Runtime", StringComparison.OrdinalIgnoreCase)
  34.        ' This exception will be thrown generally when the current
  35.        ' running application is targetting .NET Framework
  36.        ' and Reflection (via method "GetCustomAttributes")
  37.        ' tries to load "System.Runtime" assembly.
  38.  
  39.        Dim assName As New AssemblyName(ex.FileName)
  40.        If assName.Version.Major >= 4 AndAlso assName.Version.Minor <> 0 Then
  41.            Return NetTargetType.NetCore
  42.        Else
  43.            ' Ignore and continue with the alternative .NET Core validation.
  44.        End If
  45.  
  46.    Catch ex As Exception
  47.        parimaryValidationException = ex
  48.        ' Ignore for now, and continue with the alternative validations.
  49.  
  50.    End Try
  51. #End Region
  52.  
  53. #Region " .NET Standard alternative validation (when Primary validation failed) "
  54.    Dim isNetStandard As Boolean =
  55.        assembly.GetReferencedAssemblies().
  56.                 Any(Function(x) x.Name.Equals("netstandard", StringComparison.OrdinalIgnoreCase))
  57.  
  58.    If isNetStandard Then
  59.        Return NetTargetType.NetStandard
  60.    End If
  61. #End Region
  62.  
  63. #Region " .NET Core alternative validation (when Primary validation failed) "
  64. Dim isNetCore As Boolean =
  65.    assembly.GetReferencedAssemblies().
  66.             Any(Function(x As AssemblyName)
  67.                     Return (x.Name.Equals("System.Runtime", StringComparison.OrdinalIgnoreCase) _
  68.                             AndAlso x.Version.Major >= 4 _
  69.                             AndAlso x.Version.Minor <> 0) _
  70.                             OrElse ({"System.Collections",
  71.                                      "System.ComponentModel.Primitives",
  72.                                      "System.Drawing.Primitives",
  73.                                      "System.Windows.Forms"
  74.                                     }.Contains(x.Name) _
  75.                             AndAlso x.Version.Major > 4)
  76.                 End Function)
  77.  
  78.    If isNetCore Then
  79.        Return NetTargetType.NetCore
  80.    End If
  81. #End Region
  82.  
  83.    If parimaryValidationException IsNot Nothing Then
  84.        Throw parimaryValidationException
  85.    End If
  86.    Throw New Exception("Cannot determine type of assembly.")
  87. End Function
137  Programación / .NET (C#, VB.NET, ASP) / Re: [SOLUCIONADO] ¿Cómo activar el modo oscuro en un navegador (ChromiumWebBrowser) de la librería CefSharp? en: 28 Febrero 2024, 08:01 am
puedes poner alguna imagen de como se ve ? para comparar, podrias mostrar como se veria la pagina de youtube , porfa?

Claro, no hay problema. He subido un video en Youtube:



También dejo por aquí enlaces al código fuente de ese programa, a modo de snippets para usar con CefSharp:

 - ChromiumWebBrowserExtensions.vb
Citar
(Function: SetDarkModeAsync)

 - RequestHandlerByUrlCondition.vb
Citar
Provides functionality to allow or restrict navigation requests based on whether the requested URL satisfies the condition of a specified predicate function.

 - RequestHandlerRestrictedToHostName.vb
Citar
Provides functionality to restrict navigation requests within a specific hostname.

 - CefSharpUtil.vb
138  Foros Generales / Foro Libre / Re: ¡Que chulada lo que me comprado! en: 27 Febrero 2024, 23:37 pm
no as dicho nada del pedazo de cuadro de Goku en nivel ultra instinto. Ese si que no creo que haya mucha gente que lo tenga

Mis respetos hacia el linaje de los Bardok, pero es que tampoco hay mucho que opinar sobre un cuadro con la cara de Gokuh. Se ve bien, y si te gusta, pues genial, no hay más. Si he obviado comentar a algunas cosas es por que no me gustan del todo o me resultan algo indiferentes (como una pegatina del Quake), vamos, que no tengo nada mejor que aportar opinando sobre ese tipo de cosas, por que es evidente que no a todos nos gusta lo mismo, ¿y qué clase de capullo sería yo si me pongo a comentar en tu hilo que algunas de las cosas no me gustan, no?.

Y el marco pues... cuestión de preferencias también. Tobo bien en general, al que le tiene que gustar es a ti, obvio, y está claro que te gusta mucho ese cuadro. A mi el aspecto de Gokuh me gusta más en 3ª o 4ª forma, o en forma "AF", todo lo demás creo que es igual y solo cambia el color del "aura".

Ya te digo que yo para estas cosas... si me viese forzado a colgar un cuadro de la franquicia Dragon Ball para verlo todos los días en el salón, habría elegido otro rostro, y no tendría por que ser un rostro facial precisamente, podría ser un plano del pompis de la cyborg C-17 haciendo alguna posturita graciosa, mismamente.

Anda que no habrán fotos obscenas, creativas y muy divertidas de todo eso para colgar y que se queden flipando, échale imaginación, rey de los Sayanos (bueno, ese sería el rey Vegetta, pero tú ya me entiendes).

Y nada, pues eso. Ya que me he visto inclinado a opinar sobre el cuadro para no dejarte sin respuesta, al menos que te haya servido para sugerirte ideas nuevas :D.

Pero a ver, que el cuadro, y lo que es la imágen de Gokuh, estar chulo, lo está, @Songoku. Al menos desde mi perspectiva y mis preferencias personales. Casi como cualquier otra buena imagen de Dragon Ball que haya sido seleccionada meticulosamente para ser comercializada así en plan para el lienzo de un cuadro. Solo es que... para tenerlo en casa y verlo a diario o exhibirlo... no va conmigo, me resultaría muy repetitivo ver la cara de Gokuh, que ya la he visto en cientos de episodios, y en películas.



He visto todas las páginas de este hilo, ya las había visto. Pero ahora no me vayas a preguntar sobre el fusil en miniatura del COD, ¿he? :P, eso si que no me gusta nada de nada. Tampoco esos video juegos. En general no me gustan las réplicas de cosas en miniatura. Ni los coches ni las figuritas, por ese motivo, su tamaño. Bueno, las que son articuladas si, por que al menos además de para mirarlas se pueden usar y colocar la postura que quieras, se puede ser algo creativo teniendo suficientes figuras articuladas, por ejemplo, colocarlas verticalmente apoyándose en las manos, en plan haciendo una torre de figuritas, pero es que les falta eso, más tamaño.

Soy de los que piensan que las cosas buenas son las que te permite admirar todos sus detalles con los ojos... sin tener que usar una lupa. Por eso, las armas de mentira cuanto más grandes e impresionantes, mejor.

Un BFG 9000 del Doom a escala 1:1, por ejemplo:


(Por que "Size matters.")

Eso por no mencionarte la espada de Cloud o la katana de Sephirot del FFVII, por que se que no te gusta el video juego, ¡pero vaya espadones quienes se hacen con una réplica a escala real!.

Un saludo.
139  Foros Generales / Foro Libre / Re: ¡Que chulada lo que me comprado! en: 27 Febrero 2024, 17:33 pm
¿El Tekken?, Howarang de siempre mi favorito. Las palizas eran mortales, me aprendía la lista de combos al dedillo y nadie se atrevía a acercarse a mi personaje con la pierna alzada :xD :xD :xD

...Al menos hasta el Tekken 5, los demás no los he jugado en grupo.

El Yoshimitsu, otro clásico del que me acuerdo bien, por que también era un mamonazo quien supiera jugarlo hábil y estratégicamente con la técnica del harakiri, que no recuerdo el nombre exacto y oficial, pero creo que era "self-suicide", y creo que era un movimiento inesquivable, ya no lo recuerdo. Aunque después del Tekken 3 ese personaje ya no se sentía tan "imbatible".



El cubo originario del continente de los canguros mola bastante. Muchísimo. Aunque yo para estas cosas, si me lo comprase para mi, siempre iría única y exclusivamente a intentar pillarme lo que tuviese más... como decirlo... bultos femeninos.

Por que para exhibir un cuerpo masculino ya tengo el mío propio (mi cuerpo escombro quiero decir :xD) y me lo veo todos los días en el espejo, por eso aparte también soy el típico que siempre se elige al personaje femenino en los video juegos si me dan la opción. Por cierto, ¿eso es algo que sigue estando mal visto con prejuicios negativos e insultos en la sociedad actual?, pues no lo sé, pero prefiero mil veces jugar con personajes femeninos que jugar viendo como se le mueve el trasero y el "pecho palomo" a un tío solo para "sentirse identificado con el personaje y su masculinidad". Así que si el "salido" o el "rarito" con los video juegos soy yo, pues vale, y a mucha honra xD.

Lo del Howarang es una excepción, como Ryu o Ken (Street Fighter) y otros tantos, si es por competitividad no distingo entre masculino y femenino.

Bueno. A lo mejor he divagado demasiado en toda esta parte, me he dejado llevar y he escrito una opinión muy larga, lo siento. Es el foro libre.

¡Estoy hablando casi todo el rato de mi!, no puede ser. @Songoku, dime que tipo de preferecias tienes tú para jugar a los Tekken, o para coleccionar ese tipo de objetos. A lo mejor no te fijas en lo masculino ni en lo femenino (a ver, no estoy diciendo que te fijes en las curvas de ese personaje del Tekken llamado Kuma que es un oso, sino que no le das importancia al género).

En mi opinión (otra vez yo, hablando de mi), habría que hacer un amplio debate solo dedicado a eso: Las preferencias de los jugadores por la elección del género de los personajes de video juegos. Hay todo un mundo por explorar ahí.



Y la pequeña batalla campal entre coleccionistas de maquetas de coches ha estado divertido. Es que contra @simorg no se puede competir en eso. Aunque uno exponga con ilusión la foto de su nuevo Lamborghini (escala real) y todos nos mordamos las uñas, si el tito simorg le pone esa estanteria encima, se abolla, se rompe en mil pedacitos y, si es eléctrico, explota.

Está bien exhibir las cosas de cada uno, para eso están. Y cada uno tiene lo que tiene, o lo que quiere tener. Yo no puedo competir con inguno de los dos, soy pobre. xD Tengo una colección de mangas y libros, y ya está, algo muy básico y e incompleto, pero especial, como vuestras colecciones.

(Última vez que vuelvo a hablar de mi mismo.)



En fin, @Songoku, me parece buen merchandising en general, y da para que hablar. El cubo, en serio, está muy chulo y acertado (un personaje masculino y otro con tetas, así no hay quejas).

Ya irás coleccionando y mostrando más cosas, supongo.

Un saludo!
140  Programación / .NET (C#, VB.NET, ASP) / Re: Librería de Snippets para VB.NET !! (Compartan aquí sus snippets) en: 27 Febrero 2024, 13:38 pm
Los dos siguientes métodos sirven para truncar nombres de archivos que superen los 255 caracteres (incluyendo la longitud de la extensión del archivo), acortando la longitud cuanto sea necesario para no sobrepasar dicho límite, y añadiendo puntos suspensivos (…) al final del nombre del archivo.

Eso es lo que hace con los nombres de archivo (file name), no con las rutas (file path).

En caso de enviar como parámetro a cualquiera de estos dos métodos una ruta de archivo (file path), aparte de realizar los ajustes mencionados con el nombre del archivo y, en caso de que la ruta exceda el límite máximo permitido de 260 caracteres (definido en MAX_PATH), se añadirá el prefijo "\\?\" a la ruta para garantizar la compatibilidad de uso con sistemas NTFS que tengan habilitado el soporte para rutas de longitud extendida (es decir, mayores de 260 caracteres).

De esta forma, y además de prevenir el uso de nombres de archivo (file names) inválidos / demasiado largos, además se garantiza que la aplicación que utilice estos métodos para la manipulación o creación de archivos sea "LONG PATH AWARE".

Nota: Los métodos han pasado pruebas usando rutas locales (relativas y absolutas). No han sido probados con rutas UNC ni adaptados para ello.

Leer con detenimiento el bloque de documentación XML para más información.

Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' If needed, truncates the length of the specified file name or full file path  
  4. ''' to comply with Windows OS maximum file name length of 255 characters
  5. ''' (including the file extension length).
  6. ''' <para></para>
  7. ''' If the file name exceeds this limit, it truncates it and
  8. ''' adds a ellipsis (…) at the end of the file name.
  9. ''' <para></para>
  10. ''' If the path exceeds the MAX_PATH limit (260 characters),
  11. ''' it adds the "\\?\" prefix to support extended-length paths.
  12. ''' <para></para>
  13. ''' See also: <see href="https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation"/>
  14. ''' </summary>
  15. ''' ----------------------------------------------------------------------------------------------------
  16. ''' <remarks>
  17. ''' This method is particularly useful when dealing with file names or file paths that might exceed
  18. ''' the maximum allowed length, preventing potential errors related to file name length limitations
  19. ''' when creating files in the drive.
  20. ''' </remarks>
  21. ''' ----------------------------------------------------------------------------------------------------
  22. ''' <param name="filePath">
  23. ''' The file name or full file path.
  24. ''' </param>
  25. '''
  26. ''' <param name="maxFileNameLength">
  27. ''' Optional. The maximum character length that the file name can have.
  28. ''' Default (and maximum) value is 255.
  29. ''' </param>
  30. ''' ----------------------------------------------------------------------------------------------------
  31. ''' <returns>
  32. ''' The truncated file name or full file path.
  33. ''' </returns>
  34. ''' ----------------------------------------------------------------------------------------------------
  35. <DebuggerStepThrough>
  36. Public Shared Function TruncateLongFilePath(filePath As String, Optional maxFileNameLength As Byte = 255) As String
  37.  
  38.    If String.IsNullOrEmpty(filePath) Then
  39.        Throw New ArgumentNullException(paramName:=NameOf(filePath))
  40.    End If
  41.  
  42.    If filePath.StartsWith("\\?\", StringComparison.Ordinal) Then
  43.        filePath = filePath.Substring(4)
  44.    End If
  45.  
  46.    Dim fileInfo As New FileInfo(If(filePath.Length <= 255, filePath, $"\\?\{filePath}"))
  47.    TruncateLongFilePath(fileInfo, maxFileNameLength)
  48.    Return fileInfo.FullName
  49.  
  50. End Function
  51.  
  52. ''' ----------------------------------------------------------------------------------------------------
  53. ''' <summary>
  54. ''' If needed, truncates the length of the file name in
  55. ''' the source <see cref="FileInfo"/> object to comply with
  56. ''' Windows OS maximum file name length of 255 characters
  57. ''' (including the file extension length).
  58. ''' <para></para>
  59. ''' If the file name exceeds this limit, it truncates it and
  60. ''' adds a ellipsis (…) at the end of the file name.
  61. ''' <para></para>
  62. ''' If the path exceeds the MAX_PATH limit (260 characters),
  63. ''' it adds the "\\?\" prefix to support extended-length paths.
  64. ''' <para></para>
  65. ''' See also: <see href="https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation"/>
  66. ''' </summary>
  67. ''' ----------------------------------------------------------------------------------------------------
  68. ''' <remarks>
  69. ''' This method is particularly useful when dealing with file paths that might exceed
  70. ''' the maximum allowed length, preventing potential errors related to file name length limitations
  71. ''' when creating files in the drive.
  72. ''' </remarks>
  73. ''' ----------------------------------------------------------------------------------------------------
  74. ''' <param name="refFileInfo">
  75. ''' The source <see cref="FileInfo"/> object representing a full file path.
  76. ''' <para></para>
  77. ''' When this method returns, this object contains the file path with the file name truncated.
  78. ''' </param>
  79. '''
  80. ''' <param name="maxFileNameLength">
  81. ''' Optional. The maximum character length that the file name can have.
  82. ''' Default (and maximum) value is 255.
  83. ''' </param>
  84. ''' ----------------------------------------------------------------------------------------------------
  85. <DebuggerStepThrough>
  86. Public Shared Sub TruncateLongFilePath(ByRef refFileInfo As FileInfo, Optional maxFileNameLength As Byte = 255)
  87.  
  88.    If refFileInfo Is Nothing Then
  89.        Throw New ArgumentNullException(paramName:=NameOf(refFileInfo))
  90.    End If
  91.  
  92.    If maxFileNameLength = 0 Then
  93.        Throw New ArgumentException("Value must be greater than zero.", paramName:=NameOf(maxFileNameLength))
  94.    End If
  95.  
  96.    If refFileInfo.Name.Length >= maxFileNameLength Then
  97.        Dim fileExt As String = refFileInfo.Extension
  98.        Dim fileName As String = refFileInfo.Name.Substring(0, maxFileNameLength - 1 - fileExt.Length) & $"…{fileExt}"
  99.  
  100.        Dim directoryName As String = Path.GetDirectoryName(refFileInfo.FullName)
  101.        If directoryName.Equals("\\?", StringComparison.Ordinal) Then
  102.            refFileInfo = New FileInfo($"\\?\{fileName}")
  103.  
  104.        ElseIf directoryName.StartsWith("\\?\", StringComparison.Ordinal) Then
  105.            refFileInfo = New FileInfo(Path.Combine(refFileInfo.DirectoryName, fileName))
  106.  
  107.        Else
  108.            Dim fullpath As String = Path.Combine(refFileInfo.DirectoryName, fileName)
  109.            refFileInfo = If(fullpath.Length >= 260, ' MAX_PATH
  110.                          New FileInfo($"\\?\{fullpath}"),
  111.                          New FileInfo(fullpath))
  112.        End If
  113.    End If
  114.  
  115. End Sub
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 [14] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ... 1236
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines