[APORTE] FileDater (Preserva, establece, o restaura las fechas de un archivo)

Iniciado por Eleкtro, 22 Julio 2014, 05:34 AM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

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