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

#6821
Hola

Las temperaturas de mis hdd ahora en verano están entre 45º-49º (tanto los hdd activos como los inactivos) y me gustaría refrigerarlos en la medida de lo posible...

Tengo 4 Hdd's, cada uno está "pegado" al otro, es decir hay 4 compartimentos, pues 4 hdd's con el espacio mínimo entre cada compartimento,
y lo único que encuentro respecto a la ventilación de HDD es este artículo: http://www.pccomponentes.com/scythe_ita_kaze_slim_hard_disk_cooler.html

Soy inexperto en el tema, nunca he comprado ese tipo de ventilador ni lo he visto en un PC.

· ¿Pueden surgir complicaciones por no haber el suficiente hueco entre mis hdd's?

· ¿Un ventilador de los normales se supone que también serviría de la misma manera?

No se, espero cualquier tipo de consejo.
un saludo!
#6822
Hardware / Re: Duda pasta térmica
22 Julio 2014, 19:11 PM
Al final estos son los videos que seguí, los comparto por si a alguien les sirve:

[youtube=640,360]https://www.youtube.com/watch?v=vO4yokgcOY4[/youtube]

[youtube=640,360]https://www.youtube.com/watch?v=XLlrqzwxJig[/youtube]
#6823
Hola

Gracias por vuestra ayuda, y @Knario & @MinusFour un detalle por las imágenes.

Además del extraño problema de las RAM, cuanto yo intentaba insertar en mi tarjeta de video (nVidia) un cable HDMI que va a la TV, ¡este siempre me tiraba un error del driver al conectarlo!, pero intenté actualizar el driver de video y el problema seguía, y eso no es todo, para colmo la tarjeta de audio durante unos días no sonaba bien, el canal de audio transmitia con mucho ruido en la señal de audio ...ya tuve este problema en el pasado y en aquella ocasión fue porque la tarjeta se murió, y me acojoné.
( Todo eso me empezó a pasar despues del montaje dle PC, antes no me pasaba esto. )

Pero el problema ya se ha arreglado por si solo, de un día para otro, sin hacer NADA, simplemente dejar pasar el tiempo, en los 4-6 días siguientes del montaje del disipador, se arregló.

Ya he podido insertar las 3 tarjetas, ya no me pitan, pero me tendré que comprar otra HyperX genesis porque no caí en el detalle del Single Channel que comentó @MinusFour,
la tarjeta de video me funciona sin problemas de driver, y ya no hay artefactos de ruido en la señal de la tarjeta de audio.

Es un misterio, tantos problemas y que se arreglen sin hacer nada...  :xD

En fín, mi hipotesis es que el problema fue por la instalación del disipador, debido a mi inexperiencia (era la primera vez que tocaba el microprocesador) deduzco que la pasta térmica necesita algún tiempo (1-2 o 3 días) para secarse del todo y que no de problemas con el resto del hardware, o quizás me pasé con la pasta termica...aunque yo creo que no, bueo, solo es una hipotesis, vosotros sabreis si estoy en lo cierto o no, pero me parece que ahí es donde fallé, al no darle tiempo para secarse.

Lo que me importa es que ya se arregló, y por aquí encontré algunas personas dispuestas a echarme una mano, gracias :)

Tema resuelto,
Saludos.

#6824
Hola, este mensaje ya os lo envié a los participantes del hilo, pero principalmente me habría gustado poder haberlo publicado aquí, así que eso haré:




Todo el mundo se puso a hablar de interés, desinterés, fama, programación, ¡y cosas sin sentido!.

¿Que os pasa?.

Porfavor, dejarme aclararos punto por punto lo que pensais cada uno y lo que habeis insinuado acerca de mi, porque estais equivocados... menos @Dantemc y @engel-lex cuyas perspectiva me parecieron correctas, positivas y razonables.

Yo no busco que se me de algo de nada, yo no exijo nada, ¿sabeis?, pero cuando estás haciendo una labor (DESINTERESADA) de la que otra persona (el Admin, en este caso) si que se beneficia en algún sentido (porque mal no le viene, le viene bien), pues lo mímimo que espero por parte de esa persona es que esté ahí cuando se lanecesite, en caso de tener una idea ...para decirme "SI", o "NO", y en caso de tener una duda ...para explicarmela.
Ccreo que eso es lo mínimo que puede esperar cualquier persona de su "jefe", y si no es así pues uno se cansa y deja de "cumplir", ¿o no?. Pero vosotros lo llamais interés, cuando en realidad se llama RESPETO.

PD: Con lo siguiente ya habré dicho todo lo que tengo que decir sobre el tema, no voy a publicar ningún comentario más en este hilo para volver a intentar aclarar dudas, quien quiera pensar a su manera y mal... que lo siga haciendo.






Cita de: owl-eyes en 19 Julio 2014, 00:00 AM
Elektro, no tienes que ponerme así como disputa de un usuario común, que yoo también llevo tiempo aquí. Nadie vale más que otros solo porque saben prgramar o fueron superman en el pasado. No juzgues a un libro por su portada.   :-\

Te pido disculpas por crear un OFF-TOPIC invadiendo tu post (aunque de todas formas, ten en cuenta que ya te habian respondido para resolverte tus dudas), pero en el resto de lo que has dicho te equivocas, no te juzgo, si lees mi comentario verás que cuando digo "nuevos" es generalizando ...porque este no es el primer caso, creo que se entiende, por supuesto no tengo nada contra ti.

Cita de: owl-eyes en 19 Julio 2014, 00:00 AMo único que tiene aquí Christian Soriano, es el conocimiento de la programación, que pena que no tenga para más y como muchos programadores, caen muy bajo creyendo que son mejores que los demás

No se porque tienes que faltarme tanto el respeto con cada comentario ...o con los programadores en general, pues parece que tengas algún problema con los programadores, pero si no pretendes caer en la hipocresía entonces deberías aplicarte tus propias palabras y no juzgar a los demás.

Se nota que me conoces bien poco, pero para tu información como ya te he comentado no me creo mejor que nadie, podrías revisar los miles de comentarios que he publicado y lo que encontrarías es que nunca me verás haber afirmado que yo sepa más que alguien, ni tampoco que yo sepa mucho sobre algo, ni mucho menos haber ridiculizado los conocimientos de los demás, PERO SI VERÁS COMO EN MUCHAS OCASIONES HE LLEGADO A DECIR TODO LO CONTRARIO (cuando por ejemplo me dicen que se mucho sobre "algo" o que soy muy bueno en "algo"), creo que eso demuestra que, a pesar de que tu intentes insinuar que yo me creo mejor que alguien, en ralidad soy modesto, y esto te lo digo yo como te lo puede decir cualquier otra persona del foro que haya leido suficientes comentarios mios, por dios, pero creo que en realidad simplemente te molestó lo que hice y ahora pretendes trollear con ese tipo de comentarios... porque me cuesta creer que me consideres un "creido".

Citarademás de que Christian Soriano (Elektro), me cagó el tema
Tu tema ya quedo resuelto con el primer comentario que recibiste, mi comentrio llegó luego, aunque no te lo discuto ...se que te ha sentado mal, disculpas.






( Con DaniPhii ya hablé por privado, es un tio muy majo y ya hemos arreglado nuestras diferencias, pero creo que no sería correcto modificar el contenido de este mensaje original )

Cita de: DaniPhii en 19 Julio 2014, 00:23 AMsi decides dedicarte desinteresadamente a determinadas tareas, pasarás de hacerlo estando pendiente de la valoración que los demás hagan de tu trabajo (y a la espera de una oportunidad para rechazar críticas invalidándolas con argumentos típicos y/o falaces) a hacerlo de forma verdaderamente desinteresada, convirtiendo las críticas y vacíos que pretenden hacerte los demás en ruido ambiental para que la valoración que haces de tu propio trabajo y de ti mismo se convierta en tu único incentivo.

En el momento que le echas en cara a alguien que, en resumen, es un inepto por no valorar tu trabajo, estás dejando de valorar tus propios principios, así que no tiene sentido que los defiendas después de caer así de bajo.

Si después de leerme te estás tomando mis palabras como un ataque personal, quizá te falta objetividad para

CitarSi lo hace de forma desinteresada, no tiene por qué importarle lo que los demás piensan.

No me lo tomo como un ataque personal, pero no estoy deacuerdo contigo en la mayor parte de lo que dices.

Si una persona no se valora a si mismo o si tampoco puede estimar una valoración de su rendimiento cumpliendo "X" tarea entonces esa persona TIENE UN GRAVE PROBLEMA, pero tu insinuas que debe ser todo lo contrario, que si una persona afirma que no se le valora entonces esa persona es estúpida, engreida, o no vale nada como persona...

Tus palabras también pueden dar lugar a pensar que yo durante estos años no me he tomado mi tarea de forma verdaderamente desinteresada como subrayas, de echo eso es lo que insinuas en tu segundo comentario, vale, dime tú:
¿Que ves de interés en esperar respeto por el "jefe"?, ¿el respeto es algo relacionado con el interés?, creo que además de estar equivocado no te estás poniendo en mi lugar, así que te daré un ejemplo real:

Si tu llevases a cabo una labor desinteresada y en varias ocasiones necesitases acudir a "el jefe" para proponerle una idea o que te resolviese una duda, pero "el jefe" te ignorase siempre, eso significaría que ni te valora a ti ni tampoco está valorando tu tarea ...¿o no?, ¿y no tendrías derecho a quejarte y afirmar que "no se te valora" sin dar lugar a pensar chorradas como por ejemplo que tu labor es interesada?, digo yo, ¡vaya!.

Y ya, para acabar el tema contigo, sobre la comparación de "comida" bien echa, o sobre todo lo que has insinuado de mi, en mi opinión creo que el interés no sería esperar (o pensar, dudar, imaginar, soñar) que la comida gustase a los demás, interés sería esperar que la comida les gustase para intentar sacar beneficio/provecho/ganancia de esa situación, y creo que con eso... ya te lo he dicho todo, ¿entiendes?.






Cita de: el-brujo en 18 Julio 2014, 23:38 PMNo tiene nada que ver contigo, te lo aseguro. Entiendo en parte que etés disgustado con el foro, porque supongo que ya te gustaría ser algo más que moderador.

( Ya le he comentado lo que le tenia que decir a el-Brujo por privado respecto a este tema, pero lo resumiré muy brevemente para los demás: )

A mi lo que me molesta de este asunto no es tener un "rango" mayor o menor en el foro, a mi lo que me molesta es que yo, siendo bastante veterano ya en el foro habiendo echo una labor desinteresada durante todo ese tiempo, sea el último mono cuando se trata de dirigirme la palabra, y eso debería ser al revés, ya que considero que al estar colaborando dia tras dia en el foro debería tener algo más de preferencia en ese sentido..., por ejemplo cuando yo tengo una pregunta "el jefe" no está ahí para contestarme, y cuando tengo una idea "el jefe" tampoco aparece para confirmarme o denegarme la idea, mientras que (generalizando) para todos los usuarios nuevos del foro (los cuales no han invertido tiempo de sus vidas en ayudar a esta página) es muy diferente, es todo lo diferente a lo que sucede conmigo, así que en mi opinión eso significa que ni a mi ni a mi lavor se nos valora, y no le veo ningún interés en decir eso.

PD: @All: ¿Se entiende el concepto de "valoración" y "desinterés" o aun no quieren entenderlo?.

Saludos!
#6825
Esta Class sirve para preservar una o todas las fechas de un archivo para poder restaurarlas en cualquier otro momento, me parece muy útil para modificar archivos los cuales no quieres que sus fechas actuales se alteren después de la modificación... y con este "ayudante" ahorrarás tiempo y escritura de código.
Esta Class también sirve para establecer fechas en un archivo (aunque esa característica simplemente está ahí para decorar, para extender un poco su funcionalidad).

Nota: En la Class podrán notar que le añadí la implementación de la interface IDisposable, en un principio esto podría parecer innecesario, pero la añadí para evitar el poder crear instancias que usen el mismo archivo, ya que no le encuentro sentido alguno al permitir estar preservando/restaurando las fechas de un mismo archivo en distintas instancias y esto podría ocasionar confusiones además de un uso indebido, y además, de esta forma el uso de los bloques Using también pueden prevenir algún que otro descuido.

Espero que a alguien le sirva :).






Ejemplo de uso:

1.
Código (vbnet) [Seleccionar]
       ' Instance the FileDater Class.
       Using fd As New FileDater(File:="C:\Test File.txt")

           ' Preserve the current date-modified of the file.
           fd.Preserve(FileDater.DateType.Modified)

           ' Do some kind of operation that alters the current date-modified of the file.
           IO.File.AppendAllText(fd.File.FullName, New String("X"c, 10I))

           ' Restore the previously preserved date-modified on the TestFile.
           fd.Restore(FileDater.DateType.Modified)

       End Using '/ fd


2.
Código (vbnet) [Seleccionar]
       ' Instance a test FileInfo using an unique temp file.
       Dim TestFile As New IO.FileInfo(IO.Path.GetTempFileName)

       ' Instance the FileDater Class.
       Using fd As New FileDater(File:=TestFile)

           ' Preserve the current dates of the TestFile.
           fd.Preserve(FileDater.DateType.Created Or FileDater.DateType.Accessed Or FileDater.DateType.Modified)

           ' Show the type of the current preserved dates.
           MessageBox.Show(fd.PreservedTypes.ToString)

           ' Show current preserved date-creation.
           MessageBox.Show(fd.PreservedCreationDate.ToString)

           ' Modify the current date-creation on the TestFile.
           fd.Set(FileDater.DateType.Created, Date.Parse("01/01/2015"))

           ' Restore the previously preserved date-creation on the TestFile.
           fd.Restore(FileDater.DateType.Created)

           ' Show the current Creation date of the TestFile.
           MessageBox.Show(TestFile.CreationTime)

       End Using







El código:

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro
' Modified : 07-22-2014
' ***********************************************************************
' <copyright file="FileDater.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Usage Examples "

#Region " Example 1 "

'' Instance the FileDater Class.
'Using fd As New FileDater(File:="C:\Test File.txt")

'    ' Preserve the current date-modified of the file.
'    fd.Preserve(FileDater.DateType.Modified)

'    ' Do some kind of operation that alters the current date-modified of the file.
'    IO.File.AppendAllText(fd.File.FullName, New String("X"c, 10I))

'    ' Restore the previously preserved date-modified on the TestFile.
'    fd.Restore(FileDater.DateType.Modified)

'End Using '/ fd

#End Region

#Region " Example 2 "

'' Instance a test FileInfo using an unique temp file.
'Dim TestFile As New IO.FileInfo(IO.Path.GetTempFileName)

'' Instance the FileDater Class.
'Using fd As New FileDater(File:=TestFile)

'    ' Preserve the current dates of the TestFile.
'    fd.Preserve(FileDater.DateType.Created Or FileDater.DateType.Accessed Or FileDater.DateType.Modified)

'    ' Show the type of the current preserved dates.
'    MessageBox.Show(fd.PreservedTypes.ToString)

'    ' Show current preserved date-creation.
'    MessageBox.Show(fd.PreservedCreationDate.ToString)

'    ' Modify the current date-creation on the TestFile.
'    fd.Set(FileDater.DateType.Created, Date.Parse("01/01/2015"))

'    ' Restore the previously preserved date-creation on the TestFile.
'    fd.Restore(FileDater.DateType.Created)

'    ' Show the current Creation date of the TestFile.
'    MessageBox.Show(TestFile.CreationTime)

'End Using

#End Region

#End Region

#Region " Imports "

Imports System.ComponentModel
Imports System.IO

#End Region

#Region " FileDater "

''' <summary>
''' Contains methods to preserve, set, and restore the dates contained on file.
''' </summary>
Public NotInheritable Class FileDater : Implements IDisposable

#Region " Objects "

   ''' <summary>
   ''' Contains the files that are already used in the constructor to prevent a duplicated instance for the same file.
   ''' </summary>
   Private Shared InstancedFiles As New List(Of FileInfo)

#End Region

#Region " Properties "

   ''' <summary>
   ''' Gets the file.
   ''' </summary>
   ''' <value>The file.</value>
   Public ReadOnly Property [File] As FileInfo
       Get
           Return Me._File
       End Get
   End Property
   Private _File As FileInfo

   ''' <summary>
   ''' Gets the type of the current preserved dates.
   ''' </summary>
   Public ReadOnly Property PreservedTypes As DateType
       Get
           Return Me._PreservedTypes
       End Get
   End Property
   Private _PreservedTypes As DateType = Nothing

   ''' <summary>
   ''' Gets the preserved creation date.
   ''' </summary>
   ''' <value>The preserved creation date.</value>
   Public ReadOnly Property PreservedCreationDate As Date
       Get
           Return Me._PreservedCreationDate
       End Get
   End Property
   Private _PreservedCreationDate As Date

   ''' <summary>
   ''' Gets the preserved last-access date.
   ''' </summary>
   ''' <value>The preserved creation date.</value>
   Public ReadOnly Property PreservedLastAccessDate As Date
       Get
           Return Me._PreservedLastAccessDate
       End Get
   End Property
   Private _PreservedLastAccessDate As Date

   ''' <summary>
   ''' Gets the preserved last-modify date.
   ''' </summary>
   ''' <value>The preserved creation date.</value>
   Public ReadOnly Property PreservedLastModifyDate As Date
       Get
           Return Me._PreservedLastModifyDate
       End Get
   End Property
   Private _PreservedLastModifyDate As Date

#End Region

#Region " Enumerations "

   ''' <summary>
   ''' Contains a FileDate flag.
   ''' </summary>
   <FlagsAttribute>
   Public Enum DateType As Integer

       ''' <summary>
       ''' The date when the file was created.
       ''' </summary>
       Created = 1I

       ''' <summary>
       ''' The date when the file was accessed by last time.
       ''' </summary>
       Accessed = 2I

       ''' <summary>
       ''' The date when the file was modified by last time.
       ''' </summary>
       Modified = 4I

   End Enum

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Initializes a new instance of the <see cref="FileDater"/> class.
   ''' </summary>
   ''' <param name="File">Indicates the <see cref="FileInfo"/> instance.</param>
   ''' <exception cref="System.Exception"></exception>
   Public Sub New(ByVal [File] As FileInfo)

       If Not InstancedFiles.Contains([File]) Then
           Me._File = [File]
           InstancedFiles.Add([File])

       Else
           Throw New Exception(String.Format("Another instance of the '{0}' class is using the same file.", MyBase.GetType.Name))

       End If

   End Sub

   ''' <summary>
   ''' Initializes a new instance of the <see cref="FileDater"/> class.
   ''' </summary>
   ''' <param name="File">Indicates the file.</param>
   Public Sub New(ByVal [File] As String)
       Me.New(New FileInfo([File]))
   End Sub

   ''' <summary>
   ''' Prevents a default instance of the <see cref="FileDater"/> class from being created.
   ''' </summary>
   Private Sub New()
   End Sub

#End Region

#Region " Hidden Methods "

   ''' <summary>
   ''' Serves as a hash function for a particular type.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Public Shadows Sub GetHashCode()
   End Sub

   ''' <summary>
   ''' Determines whether the specified System.Object instances are considered equal.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Public Shadows Sub Equals()
   End Sub

   ''' <summary>
   ''' Determines whether the specified System.Object instances are the same instance.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Private Shadows Sub ReferenceEquals()
   End Sub

   ''' <summary>
   ''' Returns a String that represents the current object.
   ''' </summary>
   <EditorBrowsable(EditorBrowsableState.Never)>
   Public Shadows Sub ToString()
   End Sub

#End Region

#Region " Public Methods "

   ''' <summary>
   ''' Preserves the specified dates of the file to restore them later at any time.
   ''' Note: Dates can be preserved again at any time.
   ''' </summary>
   ''' <param name="DateType">Indicates the type of dates to preserve.</param>
   Public Sub Preserve(ByVal DateType As DateType)

       Me.DisposedCheck()

       ' Creation
       If DateType.HasFlag(FileDater.DateType.Created) Then
           Me._PreservedCreationDate = Me._File.CreationTime
       End If

       ' Accessed
       If DateType.HasFlag(FileDater.DateType.Accessed) Then
           Me._PreservedLastAccessDate = Me._File.LastAccessTime
       End If

       ' Modified
       If DateType.HasFlag(FileDater.DateType.Modified) Then
           Me._PreservedLastModifyDate = Me._File.LastWriteTime
       End If

       Me._PreservedTypes = DateType

   End Sub

   ''' <summary>
   ''' Preserves at once all the dates of the file to restore them later at any time.
   ''' Note: Dates can be preserved again at any time.
   ''' </summary>
   Public Sub Preserve()

       Me.DisposedCheck()

       Me._PreservedCreationDate = Me._File.CreationTime
       Me._PreservedLastAccessDate = Me._File.LastAccessTime
       Me._PreservedLastModifyDate = Me._File.LastWriteTime

       Me._PreservedTypes = DateType.Created Or DateType.Accessed Or DateType.Modified

   End Sub

   ''' <summary>
   ''' Restores the specified preserved dates on the file.
   ''' Note: Calling this method does not cause the deletion of any preserved date.
   ''' </summary>
   ''' <param name="DateType">Indicates the type of dates to restore on the file.</param>
   ''' <exception cref="System.Exception">Any date was preserved.</exception>
   Public Sub Restore(ByVal DateType As DateType)

       Me.DisposedCheck()

       ' Creation
       If DateType.HasFlag(FileDater.DateType.Created) _
       AndAlso Me._PreservedTypes.HasFlag(FileDater.DateType.Created) Then

           Me._File.CreationTime = Me._PreservedCreationDate

       ElseIf DateType.HasFlag(FileDater.DateType.Created) _
       AndAlso Not Me._PreservedTypes.HasFlag(FileDater.DateType.Created) Then

           Throw New Exception(String.Format("The specified date was not preserved.")) With {
               .Source = FileDater.DateType.Created.ToString
           }

       End If

       ' Accessed
       If DateType.HasFlag(FileDater.DateType.Accessed) _
       AndAlso Me._PreservedTypes.HasFlag(FileDater.DateType.Accessed) Then

           Me._File.LastAccessTime = Me._PreservedLastAccessDate

       ElseIf DateType.HasFlag(FileDater.DateType.Accessed) _
       AndAlso Not Me._PreservedTypes.HasFlag(FileDater.DateType.Accessed) Then

           Throw New Exception(String.Format("The specified date was not preserved.")) With {
               .Source = FileDater.DateType.Accessed.ToString
           }

       End If

       ' Modified
       If DateType.HasFlag(FileDater.DateType.Modified) _
       AndAlso Me._PreservedTypes.HasFlag(FileDater.DateType.Modified) Then

           Me._File.LastWriteTime = Me._PreservedLastModifyDate

       ElseIf DateType.HasFlag(FileDater.DateType.Modified) _
       AndAlso Not Me._PreservedTypes.HasFlag(FileDater.DateType.Modified) Then

           Throw New Exception(String.Format("The specified date was not preserved.")) With {
               .Source = FileDater.DateType.Modified.ToString
           }

       End If

   End Sub

   ''' <summary>
   ''' Restores at once all the preserved dates on the file.
   ''' Note: Calling this method does not cause the deletion of any preserved date.
   ''' </summary>
   Public Sub Restore()

       Me.DisposedCheck()

       ' Creation
       If Me._PreservedTypes.HasFlag(FileDater.DateType.Created) Then
           Me._File.CreationTime = Me._PreservedCreationDate
       End If

       ' Accessed
       If Me._PreservedTypes.HasFlag(FileDater.DateType.Accessed) Then
           Me._File.LastAccessTime = Me._PreservedLastAccessDate
       End If

       ' Modified
       If Me._PreservedTypes.HasFlag(FileDater.DateType.Modified) Then
           Me._File.LastWriteTime = Me._PreservedLastModifyDate
       End If

   End Sub

   ''' <summary>
   ''' Sets the specified dates on the file.
   ''' Note:
   ''' Calling this method does not cause the deletion of any preserved date.
   ''' After setting a date, must call once the <see cref="Preserve"/> method if want to preserve any new date established.
   ''' </summary>
   ''' <param name="DateType">Indicates the type of dates to set on the file.</param>
   ''' <param name="Date">Indicates the date.</param>
   Public Sub [Set](ByVal DateType As DateType, ByVal [Date] As Date)

       Me.DisposedCheck()

       ' Creation
       If DateType.HasFlag(FileDater.DateType.Created) Then
           Me._File.CreationTime = [Date]
       End If

       ' Accessed
       If DateType.HasFlag(FileDater.DateType.Accessed) Then
           Me._File.LastAccessTime = [Date]
       End If

       ' Modified
       If DateType.HasFlag(FileDater.DateType.Modified) Then
           Me._File.LastWriteTime = [Date]
       End If

   End Sub

   ''' <summary>
   ''' Sets at once all the dates on the file.
   ''' Note:
   ''' Calling this method does not cause the deletion of any preserved date.
   ''' After setting a date, must call once the <see cref="Preserve"/> method if want to preserve any new date established.
   ''' </summary>
   ''' <param name="Date">Indicates the date.</param>
   Public Sub [Set](ByVal [Date] As Date)

       Me.DisposedCheck()

       Me._File.CreationTime = [Date]
       Me._File.LastAccessTime = [Date]
       Me._File.LastWriteTime = [Date]

   End Sub

#End Region

#Region " IDisposable "

   ''' <summary>
   ''' To detect redundant calls when disposing.
   ''' </summary>
   Private IsDisposed As Boolean = False

   ''' <summary>
   ''' Prevent calls to methods after disposing.
   ''' </summary>
   ''' <exception cref="System.ObjectDisposedException"></exception>
   Private Sub DisposedCheck()

       If Me.IsDisposed Then
           Throw New ObjectDisposedException(Me.GetType().FullName)
       End If

   End Sub

   ''' <summary>
   ''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
   ''' </summary>
   Public Sub Dispose() Implements IDisposable.Dispose
       Dispose(True)
       GC.SuppressFinalize(Me)
   End Sub

   ''' <summary>
   ''' Releases unmanaged and - optionally - managed resources.
   ''' </summary>
   ''' <param name="IsDisposing">
   ''' <c>true</c> to release both managed and unmanaged resources;
   ''' <c>false</c> to release only unmanaged resources.
   ''' </param>
   Protected Sub Dispose(ByVal IsDisposing As Boolean)

       If Not Me.IsDisposed Then

           If IsDisposing Then
               InstancedFiles.Remove(Me._File)
           End If

       End If

       Me.IsDisposed = True

   End Sub

#End Region

End Class

#End Region
#6826
Aquí tienen la Class:

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro
' Modified : 07-21-2014
' ***********************************************************************
' <copyright file="PlaylistEditor.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Imports "

Imports System.ComponentModel
Imports System.IO
Imports System.Text

#End Region

#Region " PlaylistEditor "

''' <summary>
''' Contains methods to manage the contents of a multimedia playlist file.
''' This class cannot be inherited.
''' </summary>
Public NotInheritable Class PlaylistEditor

#Region " Properties "

    ''' <summary>
    ''' Gets the playlist filepath.
    ''' </summary>
    ''' <value>The playlist filepath.</value>
    Public ReadOnly Property FilePath As String
        Get
            Return Me._FilePath
        End Get
    End Property
    Private _FilePath As String

    ''' <summary>
    ''' Gets the playlist type.
    ''' </summary>
    ''' <value>The playlist type.</value>
    Public ReadOnly Property Type
        Get
            Return Me._Type
        End Get
    End Property
    Private _Type As PlaylistType

    ''' <summary>
    ''' Gets the playlist file encoding.
    ''' </summary>
    ''' <value>The playlist file encoding.</value>
    Public ReadOnly Property FileEncoding As Encoding
        Get
            Return Me._Encoding
        End Get
    End Property
    Private _Encoding As Encoding

    ''' <summary>
    ''' Gets a value indicating whether the append mode is activated.
    ''' </summary>
    ''' <value><c>true</c> if append mode is activated; otherwise, <c>false</c>.</value>
    Public ReadOnly Property Append As Boolean
        Get
            Return Me._Append
        End Get
    End Property
    Private _Append As Boolean

#End Region

#Region " Enumerations "

    ''' <summary>
    ''' Indicates the type of a playlist.
    ''' </summary>
    <Description("Enumeration used as 'PlaylistType' parameter of 'New' constructor.")>
    Public Enum PlaylistType As Integer

        ''' <summary>
        ''' M3U Playlist.
        ''' Documentation: http://en.wikipedia.org/wiki/M3U
        ''' </summary>
        M3U = 0I

        ''' <summary>
        ''' PLS Playlist.
        ''' Documentation: http://en.wikipedia.org/wiki/PLS_%28file_format%29
        ''' </summary>
        PLS = 1I

    End Enum

#End Region

#Region " Types "

    ''' <summary>
    ''' Contains extended info of a playlist track.
    ''' </summary>
    Public Class TrackInfo

#Region " Properties "

        ''' <summary>
        ''' Gets the track index.
        ''' Don't set this value manually.
        ''' This value is automatically set by some of the <see cref="PlaylistEditor"/> methods,
        ''' and has any effect for other purposes.
        ''' </summary>
        ''' <value>The track index.</value>
        Public Property Index As Integer

        ''' <summary>
        ''' Gets or sets the track filepath.
        ''' </summary>
        ''' <value>The track filepath.</value>
        Public Property Path As String

        ''' <summary>
        ''' Gets or sets the track title.
        ''' </summary>
        ''' <value>The track title.</value>
        Public Property Title As String

        ''' <summary>
        ''' Gets or sets the track length.
        ''' </summary>
        ''' <value>The track length.</value>
        Public Property Length As TimeSpan

#End Region

#Region " Hidden Methods "

        ''' <summary>
        ''' Serves as a hash function for a particular type.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Sub GetHashCode()
        End Sub

        ''' <summary>
        ''' Determines whether the specified System.Object instances are considered equal.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Sub Equals()
        End Sub

        ''' <summary>
        ''' Determines whether the specified System.Object instances are the same instance.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Private Shadows Sub ReferenceEquals()
        End Sub

        ''' <summary>
        ''' Returns a String that represents the current object.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Sub ToString()
        End Sub

#End Region

    End Class

#End Region

#Region " Constructors "

    ''' <summary>
    ''' Prevents a default instance of the <see cref="PlaylistEditor"/> class from being created.
    ''' </summary>
    Private Sub New()
    End Sub

    ''' <summary>
    ''' Initializes a new instance of the <see cref="PlaylistEditor"/> class.
    ''' </summary>
    ''' <param name="PlaylistFile">Indicates the playlist filepath.</param>
    ''' <param name="PlaylistType">Indicates the type of the playlist.</param>
    ''' <param name="Append">
    ''' If set to <c>true</c> the <see cref="PlaylistEditor"/> instance will assume that the playlist file already exist,
    ''' and will append any new entries in the existing file.
    ''' If set to <c>false</c> the <see cref="PlaylistEditor"/> instance will assume that the playlist file does not exist,
    ''' and will create the file.
    ''' </param>
    ''' <param name="FileEncoding">
    ''' Optionally indicates the file encoding to write/read the playlist content.
    ''' The default value is <see cref="Encoding.Default"/>
    ''' </param>
    Public Sub New(ByVal PlaylistFile As String,
                   ByVal PlaylistType As PlaylistType,
                   ByVal Append As Boolean,
                   Optional ByVal FileEncoding As Encoding = Nothing)

        Me._FilePath = PlaylistFile
        Me._Type = PlaylistType
        Me._Encoding = If(FileEncoding IsNot Nothing, FileEncoding, Encoding.Default)
        Me._Append = Append

        If Not _Append Then
            Me.AddHeaders()
        End If

    End Sub

#End Region

#Region " Hidden Methods "

    ''' <summary>
    ''' Serves as a hash function for a particular type.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Shadows Sub GetHashCode()
    End Sub

    ''' <summary>
    ''' Determines whether the specified System.Object instances are considered equal.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Shadows Sub Equals()
    End Sub

    ''' <summary>
    ''' Determines whether the specified System.Object instances are the same instance.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Private Shadows Sub ReferenceEquals()
    End Sub

    ''' <summary>
    ''' Returns a String that represents the current object.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Shadows Sub ToString()
    End Sub

#End Region

#Region " Private Methods "

    ''' <summary>
    ''' Adds the playlist headers in the playlist file.
    ''' This method should be called first before add any entry in the playlist.
    ''' </summary>
    Private Sub AddHeaders()

        Dim sb As New StringBuilder

        Select Case Me._Type

            Case PlaylistType.M3U
                sb.AppendLine("#EXTM3U")

            Case PlaylistType.PLS
                With sb
                    .AppendLine("[playlist]")
                    .AppendLine("NumberOfEntries=0")
                    .AppendLine("Version=2")
                End With

        End Select

        File.WriteAllText(Me._FilePath, sb.ToString, Me._Encoding)
        sb.Clear()

    End Sub

    ''' <summary>
    ''' Gets the amount of total entries of a PLS playlist file.
    ''' </summary>
    ''' <returns>The current number of total entries.</returns>
    Private Function GetPLSNumberOfEntries() As Integer

        Dim PlaylistContent As String = File.ReadAllText(Me._FilePath, Me._Encoding)

        Dim StartIndex As Integer =
            PlaylistContent.IndexOf("=") + 1I

        Dim EndIndex As Integer =
            PlaylistContent.IndexOf(ControlChars.NewLine, StartIndex) - StartIndex

        Return PlaylistContent.Substring(StartIndex, PlaylistContent.IndexOf(String.Empty, EndIndex))

    End Function

    ''' <summary>
    ''' Fixes the track index count of a PLS playlist file.
    ''' This method shoould be called after remove a track from the playlist.
    ''' </summary>
    Private Sub FixPLSTrackIndex()

        Dim PlaylistContent As List(Of String) = File.ReadAllLines(Me._FilePath, Me._Encoding).ToList
        Dim TrackCount As Integer = 0I

        For Index As Integer = 0 To (PlaylistContent.Count - 1I)

            If PlaylistContent(Index).StartsWith("File", StringComparison.OrdinalIgnoreCase) Then

                TrackCount += 1I

                PlaylistContent(Index) = String.Format("File{0}={1}",
                                                       CStr(TrackCount),
                                                       PlaylistContent(Index).Substring(PlaylistContent(Index).IndexOf("="c) + 1I))

            ElseIf PlaylistContent(Index).StartsWith("Title", StringComparison.OrdinalIgnoreCase) Then
                PlaylistContent(Index) = String.Format("Title{0}={1}",
                                                       CStr(TrackCount),
                                                       PlaylistContent(Index).Substring(PlaylistContent(Index).IndexOf("="c) + 1I))

            ElseIf PlaylistContent(Index).StartsWith("Length", StringComparison.OrdinalIgnoreCase) Then
                PlaylistContent(Index) = String.Format("Length{0}={1}",
                                                       CStr(TrackCount),
                                                       PlaylistContent(Index).Substring(PlaylistContent(Index).IndexOf("="c) + 1I))

            End If

        Next Index

        Dim NumberOfEntriesEntryIndex As Integer =
            PlaylistContent.FindIndex(Function(Item As String)
                                          Return Item.ToLower Like "numberofentries=#*"
                                      End Function)

        PlaylistContent(NumberOfEntriesEntryIndex) =
            String.Format("NumberOfEntries={0}", CStr(TrackCount))

        File.WriteAllLines(Me._FilePath, PlaylistContent, Me._Encoding)

    End Sub

#End Region

#Region " Public Methods "

    ''' <summary>
    ''' Adds a new track entry in the playlist.
    ''' </summary>
    ''' <param name="Path">Indicates the track path to add.</param>
    ''' <param name="AllowDuplicate">
    ''' If set to <c>true</c> an exception will be thrown if the track already exists in the playlist.
    ''' </param>
    ''' <exception cref="System.Exception">The TrackPath already exist in the playlist.</exception>
    Public Sub Add(ByVal [Path] As String,
                   Optional ByVal AllowDuplicate As Boolean = False)

        If Not AllowDuplicate AndAlso Me.Exist([Path]) Then
            Throw New Exception("The TrackPath already exist in the playlist.") With {.Source = [Path]}
        End If

        Dim sb As New StringBuilder

        Select Case Me._Type

            Case PlaylistType.M3U

                With sb
                    .AppendLine()
                    .AppendLine([Path])
                    File.AppendAllText(Me._FilePath, .ToString, Me._Encoding)
                    .Clear()

                End With

            Case PlaylistType.PLS

                Dim EntryCount As Integer = Me.GetPLSNumberOfEntries()

                With sb

                    .AppendLine(File.ReadAllText(Me._FilePath, Me._Encoding).
                                     Replace("NumberOfEntries=" & CStr(EntryCount),
                                             "NumberOfEntries=" & CStr(EntryCount + 1I)))

                    .AppendLine(String.Format("File{0}={1}", CStr(EntryCount + 1I), [Path].Replace("\", "/")))

                    File.WriteAllText(Me._FilePath, .ToString, Me._Encoding)
                    .Clear()

                End With

        End Select

    End Sub

    ''' <summary>
    ''' Adds a new track entry in the playlist, with extended track information.
    ''' </summary>
    ''' <param name="Path">Indicates the track to add.</param>
    ''' <param name="Title">Indicates the track title.</param>
    ''' <param name="Length">Indicates the track length.</param>
    Public Sub Add(ByVal [Path] As String,
                   ByVal Title As String,
                   ByVal Length As TimeSpan,
                   Optional ByVal AllowDuplicate As Boolean = False)

        If Not AllowDuplicate AndAlso Me.Exist([Path]) Then
            Throw New Exception("The TrackPath already exist in the playlist.") With {.Source = [Path]}
        End If

        Dim sb As New StringBuilder

        Select Case Me._Type

            Case PlaylistType.M3U

                With sb

                    .AppendLine()
                    .AppendLine(String.Format("#EXTINF:{0},{1}",
                                                CStr(Math.Truncate(Length.TotalSeconds)),
                                                Title))
                    .AppendLine([Path])

                    File.AppendAllText(Me._FilePath, .ToString, Me._Encoding)
                    .Clear()

                End With

            Case PlaylistType.PLS

                Dim EntryCount As Integer = Me.GetPLSNumberOfEntries()

                With sb

                    .AppendLine(File.ReadAllText(Me._FilePath, Me._Encoding).
                                     Replace("NumberOfEntries=" & CStr(EntryCount),
                                             "NumberOfEntries=" & CStr(EntryCount + 1I)))

                    .AppendLine(String.Format("File{0}={1}", CStr(EntryCount + 1I), [Path].Replace("\", "/")))
                    .AppendLine(String.Format("Title{0}={1}", CStr(EntryCount + 1I), Title))
                    .AppendLine(String.Format("Length{0}={1}", CStr(EntryCount + 1I), CStr(Math.Truncate(Length.TotalSeconds))))

                    File.WriteAllText(Me._FilePath, .ToString, Me._Encoding)
                    .Clear()

                End With

        End Select

    End Sub

    ''' <summary>
    ''' Adds a new track entry in the playlist, with extended track information.
    ''' </summary>
    ''' <param name="TrackInfo">A <see cref="TrackInfo"/> instance containing the extended track information.</param>
    Public Sub Add(ByVal TrackInfo As TrackInfo,
                   Optional ByVal AllowDuplicate As Boolean = False)

        Me.Add(TrackInfo.Path, TrackInfo.Title, TrackInfo.Length, AllowDuplicate)

    End Sub

    ''' <summary>
    ''' Removes the specified track entry from the playlist.
    ''' </summary>
    ''' <param name="Path">Indicates the track path to remove it's entry.</param>
    ''' <exception cref="System.Exception">The TrackPath was not found in the playlist.</exception>
    Public Sub Remove(ByVal [Path] As String)

        If Not Me.Exist([Path]) Then
            Throw New Exception("The TrackPath was not found in the playlist.") With {.Source = [Path]}
        End If

        Dim PlaylistContent As List(Of String) = File.ReadAllLines(Me._FilePath, Me._Encoding).ToList

        Select Case Me._Type

            Case PlaylistType.M3U

                Dim EntryIndex As Integer =
                    PlaylistContent.FindIndex(Function(Item As String)
                                                  Return Item.Equals([Path], StringComparison.OrdinalIgnoreCase)
                                              End Function)

                PlaylistContent.RemoveAt(EntryIndex)

                If PlaylistContent(EntryIndex - 1).StartsWith("#EXTINF", StringComparison.OrdinalIgnoreCase) Then
                    PlaylistContent.RemoveAt(EntryIndex - 1)
                End If

                File.WriteAllLines(Me._FilePath, PlaylistContent, Me._Encoding)

            Case PlaylistType.PLS

                Dim EntryIndex As Integer =
                    PlaylistContent.FindIndex(Function(Item As String)
                                                  Return Item.ToLower Like "file#*" & [Path].Replace("\", "/").ToLower
                                              End Function)

                Dim TrackIndexDelimStartIndex As Integer =
                    PlaylistContent(EntryIndex).IndexOf("e", StringComparison.OrdinalIgnoreCase) + 1I

                Dim TrackIndexDelimEndIndex As Integer =
                    PlaylistContent(EntryIndex).IndexOf("=", StringComparison.OrdinalIgnoreCase)

                Dim TrackIndex As Integer =
                    PlaylistContent(EntryIndex).Substring(TrackIndexDelimStartIndex,
                                                          TrackIndexDelimEndIndex - TrackIndexDelimStartIndex)

                PlaylistContent.RemoveAt(EntryIndex)

                Dim TitleEntryIndex As Integer =
                    PlaylistContent.FindIndex(Function(Item As String)
                                                  Return Item.ToLower Like String.Format("title{0}=*", CStr(TrackIndex))
                                              End Function)

                If TitleEntryIndex <> -1I Then
                    PlaylistContent.RemoveAt(TitleEntryIndex)
                End If

                Dim LengthEntryIndex As Integer =
                    PlaylistContent.FindIndex(Function(Item As String)
                                                  Return Item.ToLower Like String.Format("length{0}=*", CStr(TrackIndex))
                                              End Function)

                If LengthEntryIndex <> -1I Then
                    PlaylistContent.RemoveAt(LengthEntryIndex)
                End If

                Dim NumberOfEntriesEntryIndex As Integer =
                    PlaylistContent.FindIndex(Function(Item As String)
                                                  Return Item.ToLower Like "numberofentries=#*"
                                              End Function)

                PlaylistContent(NumberOfEntriesEntryIndex) =
                    String.Format("NumberOfEntries={0}", CStr(Me.GetPLSNumberOfEntries() - 1I))

                File.WriteAllLines(Me._FilePath, PlaylistContent, Me._Encoding)

                Me.FixPLSTrackIndex()

        End Select

    End Sub

    ''' <summary>
    ''' Removes the specified track entry from the playlist.
    ''' </summary>
    ''' <param name="TrackIndex">Indicates the track index to remove it's entry.</param>
    ''' <exception cref="System.IndexOutOfRangeException">TrackIndex is out of range</exception>
    Public Sub Remove(ByVal TrackIndex As Integer)

        Dim Track = Me.GetTrack(TrackIndex)

        If Track IsNot Nothing Then
            Me.Remove(Track.Path)
        Else
            Throw New IndexOutOfRangeException("TrackIndex is out of range") With {.Source = TrackIndex}
        End If

    End Sub

    ''' <summary>
    ''' Sets the extended track info of the specified track.
    ''' </summary>
    ''' <param name="Path">Indicates the track path to set its extended track info.</param>
    ''' <param name="TrackInfo">A <see cref="TrackInfo" /> instance containing the extended info to set.</param>
    ''' <exception cref="System.Exception">The TrackPath was not found in the playlist.</exception>
    Public Sub [Set](ByVal [Path] As String,
                     ByVal TrackInfo As TrackInfo)

        If Not Me.Exist([Path]) Then
            Throw New Exception("The TrackPath was not found in the playlist.") With {.Source = [Path]}
        End If

        Dim Track As TrackInfo = Me.GetTrack([Path])
        With Track
            .Path = TrackInfo.Path
            .Title = TrackInfo.Title
            .Length = TrackInfo.Length
        End With

        Dim PlaylistContent As List(Of String) = File.ReadAllLines(Me._FilePath, Me._Encoding).ToList

        Select Case Me._Type

            Case PlaylistType.M3U

                Dim EntryIndex As Integer =
                    PlaylistContent.FindIndex(Function(Item As String)
                                                  Return Item.Equals([Path], StringComparison.OrdinalIgnoreCase)
                                              End Function)

                PlaylistContent(EntryIndex) = String.Format("#EXTINF:{0},{1}",
                                                            CStr(Math.Truncate(Track.Length.TotalSeconds)),
                                                            Track.Title) & Environment.NewLine & Track.Path

                If PlaylistContent(EntryIndex - 1I).StartsWith("#EXTINF", StringComparison.OrdinalIgnoreCase) Then
                    PlaylistContent.RemoveAt(EntryIndex - 1I)
                End If

                File.WriteAllLines(Me._FilePath, PlaylistContent, Me._Encoding)

            Case PlaylistType.PLS

                Track.Path = Track.Path.Replace("\", "/")

                Dim EntryIndex As Integer =
                    PlaylistContent.FindIndex(Function(Item As String)
                                                  Return Item.ToLower Like "file#*" & [Path].Replace("\", "/").ToLower
                                              End Function)

                PlaylistContent(EntryIndex) = String.Format("File{0}={1}", CStr(Track.Index), Track.Path) & Environment.NewLine &
                                              String.Format("Title{0}={1}", CStr(Track.Index), Track.Title) & Environment.NewLine &
                                              String.Format("Length{0}={1}", CStr(Track.Index), CStr(Math.Truncate(Track.Length.TotalSeconds)))

                If PlaylistContent.Count > (EntryIndex + 1) Then

                    If PlaylistContent(EntryIndex + 2I).StartsWith("Title", StringComparison.OrdinalIgnoreCase) _
                    OrElse PlaylistContent(EntryIndex + 2I).StartsWith("Length", StringComparison.OrdinalIgnoreCase) Then

                        PlaylistContent.RemoveAt(EntryIndex + 2I)

                    End If

                End If

                If PlaylistContent.Count > EntryIndex Then

                    If PlaylistContent(EntryIndex + 1I).StartsWith("Title", StringComparison.OrdinalIgnoreCase) _
                    OrElse PlaylistContent(EntryIndex + 1I).StartsWith("Length", StringComparison.OrdinalIgnoreCase) Then

                        PlaylistContent.RemoveAt(EntryIndex + 1I)

                    End If

                End If

                File.WriteAllLines(Me._FilePath, PlaylistContent, Me._Encoding)

        End Select

    End Sub

    ''' <summary>
    ''' Sets the extended track info of the specified track.
    ''' </summary>
    ''' <param name="TrackIndex">Indicates the track index to set its extended track info.</param>
    ''' <param name="TrackInfo">A <see cref="TrackInfo" /> instance containing the extended info to set.</param>
    ''' <exception cref="System.IndexOutOfRangeException">TrackIndex is out of range</exception>
    Public Sub [Set](ByVal TrackIndex As Integer,
                     ByVal TrackInfo As TrackInfo)

        If Not Me.Exist(TrackIndex) Then
            Throw New IndexOutOfRangeException("TrackIndex is out of range") With {.Source = TrackIndex}
        End If

        Me.[Set](Me.GetTrack(TrackIndex).Path, TrackInfo)

    End Sub

    ''' <summary>
    ''' Gets the extended track information (if any) of the specified track in the playlist.
    ''' </summary>
    ''' <param name="Path">Indicates the track path.</param>
    ''' <returns>
    ''' If the track contains extended iformation,
    ''' the return value is a <see cref="TrackInfo"/> instance containing the track info.
    ''' Otherwise, the return value is an emptiness <see cref="TrackInfo"/> instance.
    ''' </returns>
    Public Function GetTrack(ByVal Path As String) As TrackInfo

        Dim PlaylistContent As List(Of String) = File.ReadAllLines(Me._FilePath, Me._Encoding).ToList
        Dim TInfo As New TrackInfo

        Select Case Me._Type

            Case PlaylistType.M3U

                Dim EntryIndex As Integer = PlaylistContent.FindIndex(Function(Item As String)
                                                                          Return Item.Equals([Path], StringComparison.OrdinalIgnoreCase)
                                                                      End Function) - 1I

                If PlaylistContent(EntryIndex).StartsWith("#EXTINF", StringComparison.OrdinalIgnoreCase) Then

                    Dim TitleDelimIndex As Integer = PlaylistContent(EntryIndex).IndexOf(","c) + 1I
                    Dim LengthDelimIndex As Integer = PlaylistContent(EntryIndex).IndexOf(":"c) + 1I

                    With TInfo

                        '.Index = EntryIndex
                        .Path = [Path]
                        .Title = PlaylistContent(EntryIndex).Substring(TitleDelimIndex)
                        .Length = TimeSpan.FromSeconds(PlaylistContent(EntryIndex).Substring(LengthDelimIndex,
                                                                                             (TitleDelimIndex - LengthDelimIndex)))
                    End With

                End If

            Case PlaylistType.PLS

                [Path] = [Path].Replace("\", "/")

                Dim Entry As String = (From Item As String In PlaylistContent
                                       Where Item.ToLower Like String.Format("file#*={0}", [Path].ToLower)).FirstOrDefault

                If Not String.IsNullOrEmpty(Entry) Then

                    Dim IndexDelimStartIndex As Integer =
                        Entry.IndexOf("e", StringComparison.OrdinalIgnoreCase) + 1I

                    Dim IndexDelimEndIndex As Integer =
                        Entry.IndexOf("=", StringComparison.OrdinalIgnoreCase)

                    Dim EntryIndex As Integer = Entry.Substring(IndexDelimStartIndex,
                                                                IndexDelimEndIndex - IndexDelimStartIndex)

                    Dim TitleEntry As String = (From Item As String In PlaylistContent
                                                Where Item.StartsWith(String.Format("Title{0}=", CStr(EntryIndex)), StringComparison.OrdinalIgnoreCase)).
                                                FirstOrDefault

                    Dim LengthEntry As String = (From Item As String In PlaylistContent
                                                 Where Item.StartsWith(String.Format("Length{0}=", CStr(EntryIndex)), StringComparison.OrdinalIgnoreCase)).
                                                 FirstOrDefault

                    With TInfo

                        .Index = EntryIndex

                        .Path = [Path]

                        .Title = If(Not String.IsNullOrEmpty(TitleEntry),
                                    TitleEntry.Substring(TitleEntry.IndexOf("=") + 1I),
                                    Nothing)

                        .Length = If(Not String.IsNullOrEmpty(TitleEntry),
                                     TimeSpan.FromSeconds(LengthEntry.Split("=").LastOrDefault),
                                     Nothing)

                    End With

                End If

        End Select

        Return TInfo

    End Function

    ''' <summary>
    ''' Gets the track path and its extended track information (if any) of the specified track index in the playlist.
    ''' </summary>
    ''' <param name="TrackIndex">Indicates the track index.</param>
    ''' <returns>
    ''' If the track index exist,
    ''' the return value is a <see cref="TrackInfo"/> instance containing the track path and its extended info (if any).
    ''' Otherwise, the return value is <c>Nothing</c>.
    ''' </returns>
    Public Function GetTrack(ByVal TrackIndex As Integer) As TrackInfo

        Dim PlaylistContent As List(Of String) = File.ReadAllLines(Me._FilePath, Me._Encoding).ToList

        Select Case Me._Type

            Case PlaylistType.M3U

                Dim TrackCount As Integer = 0I

                For Index As Integer = 0I To (PlaylistContent.Count - 1I)

                    If Not String.IsNullOrEmpty(PlaylistContent(Index)) _
                       AndAlso Not PlaylistContent(Index).StartsWith("#EXT", StringComparison.OrdinalIgnoreCase) Then

                        TrackCount += 1I

                        If TrackCount = TrackIndex Then

                            Dim TInfo As TrackInfo = Me.GetTrack(PlaylistContent(Index))
                            With TInfo
                                .Index = TrackIndex
                                .Path = PlaylistContent(Index)
                            End With

                            Return TInfo

                        End If

                    End If

                Next Index

            Case PlaylistType.PLS

                For Index As Integer = 0I To (PlaylistContent.Count - 1I)

                    If PlaylistContent(Index).StartsWith(String.Format("File{0}=", CStr(TrackIndex)),
                                                         StringComparison.OrdinalIgnoreCase) Then

                        Return Me.GetTrack(PlaylistContent(Index).Substring(PlaylistContent(Index).IndexOf("="c) + 1I))

                    End If

                Next Index

        End Select

        Return Nothing

    End Function

    ''' <summary>
    ''' Gets all the tracks and its extended track information (if any) in the playlist.
    ''' </summary>
    ''' <returns>
    ''' A <see cref="List(Of TrackInfo)"/> object containing the track entries and its extended info (if any).
    ''' </returns>
    Public Function GetTracks() As List(Of TrackInfo)

        Dim PlaylistContent As List(Of String) = File.ReadAllLines(Me._FilePath, Me._Encoding).ToList
        Dim TInfo As New List(Of TrackInfo)
        Dim TrackCount As Integer = 0I

        Select Case Me._Type

            Case PlaylistType.M3U

                For Index As Integer = 0I To (PlaylistContent.Count - 1I)

                    If Not String.IsNullOrEmpty(PlaylistContent(Index)) _
                       AndAlso Not PlaylistContent(Index).StartsWith("#EXT", StringComparison.OrdinalIgnoreCase) Then

                        TrackCount += 1
                        TInfo.Add(Me.GetTrack(TrackCount))

                    End If

                Next

            Case PlaylistType.PLS

                For Index As Integer = 0I To (PlaylistContent.Count - 1I)

                    If PlaylistContent(Index).StartsWith("File", StringComparison.OrdinalIgnoreCase) Then

                        TrackCount += 1I
                        TInfo.Add(Me.GetTrack(TrackCount))

                    End If

                Next Index

        End Select

        Return TInfo

    End Function

    ''' <summary>
    ''' Determines whether the specified track exists in the playlist.
    ''' </summary>
    ''' <param name="Path">Indicates the track path.</param>
    ''' <returns>
    ''' <c>true</c> if the track already exists in the playlist, <c>false</c> otherwise.
    ''' </returns>
    Public Function Exist(ByVal [Path] As String) As Boolean

        Dim ReturnValue As Boolean = False

        Select Case Me._Type

            Case PlaylistType.M3U

                ReturnValue = (From Item As String In File.ReadAllLines(Me._FilePath, Me._Encoding)
                               Where Item.StartsWith([Path], StringComparison.OrdinalIgnoreCase)).
                               Any()

            Case PlaylistType.PLS

                ReturnValue = (From Item As String In File.ReadAllLines(Me._FilePath, Me._Encoding)
                               Where Item.ToLower Like "file#*" & [Path].Replace("\", "/").ToLower).
                               Any()

        End Select

        Return ReturnValue

    End Function

    ''' <summary>
    ''' Determines whether the specified track exists in the playlist.
    ''' </summary>
    ''' <param name="TrackIndex">Indicates the track index.</param>
    ''' <returns><c>true</c> if the track already exists in the playlist, <c>false</c> otherwise.</returns>
    ''' <exception cref="System.IndexOutOfRangeException">TrackIndex should be greater than 0.</exception>
    Public Function Exist(ByVal TrackIndex As Integer) As Boolean

        If TrackIndex <= 0 Then
            Throw New IndexOutOfRangeException("TrackIndex should be greater than 0.") With {.Source = TrackIndex}
        End If

        Return (Me.Count >= TrackIndex)

    End Function

    ''' <summary>
    ''' Counts the amount of track entries in the playlist.
    ''' </summary>
    ''' <returns>
    ''' The amount of track entries in the playlist.
    ''' </returns>
    Public Function Count() As Integer

        Return Me.GetTracks.Count

    End Function

#End Region

End Class

#End Region
#6827
Hola

Comparto esta Class cuya finalidad es la de administrar las pistas de una lista multimedia.

Para quien no sepa lo que es una lista multimedia, son unos archivos de texto plano que utilizan los reproductores de archivos multimedia (Video/Audio) para crear listas de reproducción.

Estas son ejemplos de los tipos de listas que soporta mi Class:

M3U:
#EXTM3U

#EXTINF:330,Track1 Title
C:\Track1.avi

C:\Track2.mp4

#EXTINF:5720,Track3 Title
C:\Track3.mp3


PLS:
[playlist]
NumberOfEntries=3
Version=2

File1=C:/Track1.avi

File2=C:/Track2.mp4
Title2=My Track2 Title!
Length2=5720

File3=C:/Track3.mp3
Title3=My Track3 Title!
Length3=330


Características del código:
· Se puede trabajar con dos tipos de listas, M3U y PLS.
· Se puede añadir entradas de pistas con o sin información extendida, así como editar una entrada, eliminar, determinar si existe, o buscar para obtener la información extendida de una pista.
· La mayoría de los métodos que desarrollé tienen overloads para trabajar pasandole o bien la ruta de la pista, o el índice de la pista (primero hay que conocer el índice, claro).

El código en general no creo que me haya quedado muy optimizado, de echo tengo que evitar la recursividad de algún que otro método, pero por el momento está bien y hace su función, aunque si encuentran cualquier fallo o cualquier sugerencia que quieran hacer entonces porfavor comenten.

PD: No he añadido muchos controles de errores, ya que he supuesto que si se le da el uso correcto no debería dar errores (más hallá de los que sí están controlados).

PD2: Al principio me propuse hacerlo todo mediante FileStreams y manteniendo el archivo abierto para denegar el acceso manual al archivo, pero el formato PLS me lo puso muy complicado porque hay que hacer operaciones constantes de búsqueda y modificar un valor tras cada operación así que para no comerme mucho más la cabeza decidí usar un StringBuilder y también listas de Strings, sin más, dejando un poco de lado los permisos de lectura/escritura del archivo del playlist y tambien el rendimiento en general ...los tiempos de ejecución, pero de todas formas recordemos que se trataría de un simple archivo de texto que no debería tener muchas lineas, aunque se optimizase el código no creo que se apreciase la diferencia (en milisegundos xD)...






Estos son algunos ejemplos de uso:

Código (vbnet) [Seleccionar]
       ' **********************************
       ' Instance the PlaylistEditor Class
       ' **********************************
       Dim Playlist As New PlaylistEditor(PlaylistFile:="C:\Playlist.m3u",
                                          PlaylistType:=PlaylistEditor.PlaylistType.M3U,
                                          Append:=False,
                                          FileEncoding:=System.Text.Encoding.Default)

       ' ************************************
       ' Retrieve the instanced object info
       ' ************************************
       MessageBox.Show(Playlist.FilePath)
       MessageBox.Show(Playlist.Type.ToString)
       MessageBox.Show(CStr(Playlist.Append))
       MessageBox.Show(String.Format("Encoding: {0}, CodePage: {1}",
                                     Playlist.FileEncoding.BodyName,
                                     Playlist.FileEncoding.CodePage))

       ' ***************************
       ' Instance a TrackInfo Class
       ' ***************************
       Dim TInfo As New PlaylistEditor.TrackInfo
       With TInfo
           .Path = "C:\Track1.ext"
           .Title = "Track1 Title"
           .Length = TimeSpan.Parse("00:05:30")
       End With

       ' ***************
       ' Add a new track
       ' ***************
       Playlist.Add(TrackInfo:=TInfo)
       Playlist.Add(Path:="C:\Track2.ext", AllowDuplicate:=False)
       Playlist.Add(Path:="C:\Track3.ext", Title:="Track3 Title", Length:=TimeSpan.Parse("01:35:20"))

       ' *************************************************
       ' Sets the extended track info of an existing track
       ' *************************************************
       Dim OldTrackPath As String = "C:\Track3.ext"

       Dim TInfoSet As New PlaylistEditor.TrackInfo
       With TInfoSet
           .Path = "C:\Modified Track3.ext"
           .Title = "My modified Track3 title"
           .Length = Playlist.GetTrack(OldTrackPath).Length
       End With

       Playlist.Set(Path:=OldTrackPath, TrackInfo:=TInfoSet)

       ' ************************
       ' Remove an existing track
       ' ************************
       Playlist.Remove(Path:="C:\Track3.ext")
       Playlist.Remove(TrackIndex:=2I)

       ' ********************************
       ' Determine whether a track exists
       ' ********************************
       MessageBox.Show(Playlist.Exist(Path:="C:\Track3.ext"))
       MessageBox.Show(Playlist.Exist(TrackIndex:=3I))

       ' ************************************************
       ' Count the total amount of tracks in the playlist
       ' ************************************************
       MessageBox.Show(Playlist.Count)

       ' ************************************
       ' Get extended track info from a track
       ' ************************************
       Dim TrackInfo1 As PlaylistEditor.TrackInfo = Playlist.GetTrack(Path:="C:\Track1.ext")
       Dim TrackInfo2 As PlaylistEditor.TrackInfo = Playlist.GetTrack(TrackIndex:=2I)

       ' ******************************************
       ' Get all tracks and its extended track info
       ' ******************************************
       Dim sb As New System.Text.StringBuilder
       Dim Tracks As List(Of PlaylistEditor.TrackInfo) = Playlist.GetTracks()

       For Each Track As PlaylistEditor.TrackInfo In Tracks

           With sb
               .Clear()
               .AppendLine(String.Format("Track Index : {0}", CStr(Track.Index)))
               .AppendLine(String.Format("Track Path  : {0}", Track.Path))
               .AppendLine(String.Format("Track Title : {0}", Track.Title))
               .AppendLine(String.Format("Track Length: {0}", Convert.ToString(Track.Length)))
           End With

           MessageBox.Show(sb.ToString)

       Next Track

#6828
Cita de: Senior++ en 21 Julio 2014, 18:16 PMme quedo mejor creo jejeje
Yo considero que así está mucho mejor :P

Cita de: Senior++ en 21 Julio 2014, 18:16 PMcomentar y agradecer eso me ayuda a seguir!! :silbar:

En el paso 2, pusiste 2 videos que se supone son distintos, pero son el mismo video.

PD: Gracias por compartir.
#6829
Cita de: Senior++ en 21 Julio 2014, 15:51 PMcon que opción puedo añadirle el fondo negro? por que no me sale la opcion Glow

Es el botón que dice "Pulsante", a la derecha del botón de "Tachar".

Ejemplo:
         Deposite su texto aquí          

Raw:

[glow=black,2,300][color=red][b]Deposite su texto aquí[/b][/color][/glow]


Saludos!
#6830
Windows / Re: Problemas con lo DLL
21 Julio 2014, 15:28 PM
¿Has intentado reinstalar DirectX para reemplazar las dll "dañadas"?.

· http://www.microsoft.com/en-us/download/details.aspx?id=35 (online installer)
· http://www.microsoft.com/en-us/download/details.aspx?id=8109 (offline installer)

Saludos!