Si las declaraciones para evaluar múltiples fechas de archivo

Soy nuevo en C# (menos de una semana), tengo el siguiente código que elimina un archivo en un volumen. Es un archivo de copia de seguridad para una base de datos SQL. Y sigue creciendo tan periódicamente que tengo que cambiar el nombre del archivo y luego eliminarlo después de que se haga una copia de seguridad de un nuevo archivo. Necesito evaluar si se ejecutó la copia de seguridad y luego está bien eliminar el archivo.

    using System;
using System.IO;

class Program
{
    static void Main()
    {
        //
       //Delete a file found on the D:\ volume.
       //If the file is not found (File doesn't exist),
       //then you will get an exception.
        //
        try
        {
            File.Delete(@"\\Fabtrol-2\Program Files (x86)\FabTrolBackUp\FT_Trans_Log_Appendedold.BAK");//Try to delete
            Console.WriteLine("Deleted");//Success
        }
        catch (IOException ex)
        {
            Console.WriteLine(ex);//Write error
        }
    }
}

Esta es la lógica. Si estoy pidiendo demasiado házmelo saber:

  • Si la fecha de hoy es = lunes y el archivo FT_FabTrol_Sun_Full.BAK tiene una fecha de menos de 2 días, está bien eliminar el archivo llamado FT_Trans_Log_Appendedold.BAK
  • De lo contrario, si la fecha de hoy es = martes y el archivo FT_FabTrol_Mon_Full.BAK tiene una fecha de menos de 2 días, está bien eliminar el archivo llamado FT_Trans_Log_Appendedold.BAK
  • Si la fecha de hoy es = miércoles y el archivo FT_FabTrol_Tues_Full.BAK tiene una fecha de menos de 2 días, está bien eliminar el archivo llamado FT_Trans_Log_Appendedold.BAK
  • De lo contrario, si la fecha de hoy es = jueves y el archivo FT_FabTrol_Wed_Full.BAK tiene una fecha de menos de 2 días, está bien eliminar el archivo llamado FT_Trans_Log_Appendedold.BAK
  • De lo contrario, si la fecha de hoy es = viernes y el archivo FT_FabTrol_Thurs_Full.BAK tiene una fecha de menos de 2 días, está bien eliminar el archivo llamado FT_Trans_Log_Appendedold.BAK
  • De lo contrario, si la fecha de hoy es = sábado y el archivo FT_FabTrol_Fri_Full.BAK tiene una fecha de menos de 2 días, está bien eliminar el archivo llamado FT_Trans_Log_Appendedold.BAK
  • Si la fecha de hoy es = domingo y el archivo FT_FabTrol_Sat_Full.BAK tiene una fecha de menos de 2 días, está bien eliminar el archivo llamado FT_Trans_Log_Appendedold.BAK
1
¿Quizás quiera eliminar los archivos que tienen más de dos días y conservar los más recientes?
agregado el autor Steve, fuente
Puede omitir todos esos ifs . Si el archivo no tiene más de 2 días, elimínelo. ¿Es eso correcto?
agregado el autor Andre Calil, fuente
La clase FileInfo puede ayudarlo a obtener información sobre la creación/modificación de fechas. msdn.microsoft.com/en-us/library/system. io.fileinfo.aspx
agregado el autor Gray, fuente
@MichaelTerrian Actualicé mi respuesta para que se ajustara a sus necesidades (creo). Solo para tu información.
agregado el autor Gray, fuente
Publiqué una respuesta que hace ambas cosas.
agregado el autor Nick Bray, fuente
No, se deben cumplir dos condiciones. 1) Si la fecha de hoy es = domingo 2) y la fecha del archivo FT_FabTrol_Sat_Full.BAK tiene menos de 2 días, entonces está bien eliminar el archivo llamado FT_Trans_Log_Appendedold.BAK
agregado el autor Michael Terrian, fuente

7 Respuestas

Puedes simplificar esa lógica en gran medida con:

FileInfo info = new FileInfo(@"\\Fabtrol-2\Program Files (x86)\FabTrolBackUp\FT_Trans_Log_Appendedold.BAK");
if(DateTime.Now.AddDays(-2) > info.LastWriteTime.Date)
{
    //Delete
}
3
agregado

Todo lo que necesita hacer es recorrer todos los archivos de su carpeta y eliminar los que tienen más de dos días, ¿no es así (parece ser lo que corresponde a su declaración condicional gigante)?

Entonces, use la siguiente línea para obtener todos los archivos en la carpeta:

string[] files = Directory.GetFiles();

Luego, en un bucle, itere sobre todos los nombres de archivo en archivos y verifique si son lo suficientemente antiguos.

Para obtener la marca de tiempo del archivo, use FileInfo y LastWriteTime de esta manera:

if(DateTime.Today - someFileInfoObject.LastWriteTime.Date > new TimeSpan(2,0,0,0))
{
    File.Delete(); 
}
1
agregado

Intenta debajo del código.

 string backupFile = @"\\Fabtrol-2\Program Files (x86)\FabTrolBackUp\FT_Trans_Log_Appendedold.BAK";
 FileInfo fi = new FileInfo(backupFile);
 DateTime fileCreatedDate = File.GetCreationTime(backupFile);
 DateTime today = DateTime.Now;
 if (today.DayOfWeek != DayOfWeek.Monday && fileCreatedDate > today.AddDays(-2))
     {
        fi.Delete();
     }
0
agregado

Actualicé mi respuesta para satisfacer sus necesidades. Un poco raro, pero estaba aburrida. Puede ser útil si sólo para leer.

//2 days
TimeSpan daysToKeep = new TimeSpan(2,0,0,0);

//The folder where the files are kept
DirectoryInfo backupFolder = new DirectoryInfo(@"\\Fabtrol-2\Program Files (x86)\FabTrolBackUp\");
//the Appendold.BAK file
FileInfo backupLog = new FileInfo(backupFolder.FullName + @"\FT_Trans_Log_Appendedold.BAK");

//the base name for the log files
string logName = "FT_FabTrol_{0}_Full.BAK";
//an array for the days of week that are part of the logname
string[] days = { "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" };
//get yesterday's log file name
string yesterdayLog = String.Format(logName, days[(int)DateTime.Today.AddDays(-1).DayOfWeek]);
//create file info
FileInfo logFile = new FileInfo(backupFolder.FullName + yesterdayLog);

//if the file exists, and it is less than 2 days old
try
{
    if (logFile.Exists && (DateTime.Today - logFile.LastWriteTime < daysToKeep))
    {
        backupLog.Delete();
        Console.WriteLine("success");
    }
    else
    {
        Console.WriteLine("log file either did not exist or is not ready to delete");
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}
0
agregado

Sobre la base de lo que comentó @Gray, el objeto FileInfo también le informará si .Exists o no, aliviando la necesidad de depender del intento/captura para saber si un archivo todavía está allí.

Considera lo siguiente:

static void Main()
{
    FileInfo fi = new FileInfo(@"\\path\\to\\file.bak");

    if(fi.Exists)
    {
        try
        {
            //because we can still get errors based on permissions etc.
            fi.Delete(); 
            Console.WriteLine("Deleted");//Success
        }
        catch (IOException ex)
        {
            Console.WriteLine(ex);//Write error
        }  
    }
}
0
agregado

Personalmente, por una semana de experiencia, diría que has saltado hacia el final profundo.

I'm not going to provide code, rather direct you to improve your learning, this is referred to psuedo code

  1. Busque en streamwriter /reader y filewriter y fileinfo.
  2. A partir de esto, puedes leer archivos, eliminar/renombrar/lo que quieras realmente.
  3. Luego debes intentar entender cómo podría validar lo que estoy haciendo . Desafortunadamente para un principiante, esto es más difícil de lo que piensas, posiblemente más difícil que los dos primeros puntos para algunas personas. Pensar de lo simple en adelante, nosotros los desarrolladores usualmente complicamos las cosas. ¡Esta parte es bastante fácil, siempre y cuando tus archivos estén correctos!

Es posible que desee examinar las pruebas unitarias, ya que esto puede ayudar a su validación.

0
agregado

Este código primero comprueba si el archivo basado en el día tiene menos de 2 días de antigüedad, si es así, elimina el archivo FT_Trans_Log_Appendedold.BAK.

                string dir = @"\\Fabtrol-2\Program Files (x86)\FabTrolBackUp\";
                string fileName = dir;
                switch (DateTime.Now.DayOfWeek)
                {
                    case DayOfWeek.Monday:
                        fileName += "FT_FabTrol_Sun_Full.BAK";
                        break;
                    case DayOfWeek.Tuesday:
                        fileName += "FT_FabTrol_Mon_Full.BAK";
                        break;
                    case DayOfWeek.Wednesday:
                        fileName += "FT_FabTrol_Tues_Full.BAK";
                        break;
                    case DayOfWeek.Thursday:
                        fileName += "FT_FabTrol_Wed_Full.BAK";
                        break;
                    case DayOfWeek.Friday:
                        fileName += "FT_FabTrol_Thurs_Full.BAK";
                        break;
                    case DayOfWeek.Saturday:
                        fileName += "FT_FabTrol_Fri_Full.BAK";
                        break;
                    case DayOfWeek.Sunday:
                        fileName += "FT_FabTrol_Sat_Full.BAK";
                        break;
                }

                FileInfo fi = new FileInfo(fileName);
                if (fi.Exists && DateTime.Now.AddDays(-2) > fi.LastWriteTime.Date)
                {
                    (new FileInfo(dir + "FT_Trans_Log_Appendedold.BAK")).Delete();
                    Console.WriteLine("Deleted");
                }
0
agregado
Esto no es mucho mejor de lo que ya tiene el OP.
agregado el autor dtsg, fuente
Es en C# lo que escribió fue en palabras. Entendí que la pregunta era cómo escribir su declaración if en c #. No creo que la pregunta fuera sobre cómo realizar la prueba si tiene 2 días de antigüedad.
agregado el autor Nick Bray, fuente
Pon esto en el bloque try de tu código.
agregado el autor Nick Bray, fuente
@MichaelTerrian Lo arreglé eliminando el extra() en esa línea
agregado el autor Nick Bray, fuente
@MichaelTerrian Oh, lo siento, tienes que cambiar la línea; cadena filename = dir;
agregado el autor Nick Bray, fuente
Nick lo intentó pero obtuvo el error Nombre del método esperado en esta línea (nueva FileInfo (dir + "FT_Trans_Log_Appendedold.BAK") ()). Delete ();
agregado el autor Michael Terrian, fuente
Está bien, lo intentaré gracias.
agregado el autor Michael Terrian, fuente
Al realizar la depuración, aparece el error Error "Uso de variable local sin asignar 'nombreArchivo'"
agregado el autor Michael Terrian, fuente
Puedo pasar el error si agrego esto a la cadena nombre_archivo = Path.GetFileName (@ "\\ Fabtrol-2 \ Program Files (x86) \ FabTrolBackUp \");
agregado el autor Michael Terrian, fuente
Nick que hizo el truco. Tuve que hacer un poco más de ajustes, pero funciona de la manera que lo necesito. Muchas gracias.
agregado el autor Michael Terrian, fuente