als statements om meerdere bestandsdatums te evalueren

Ik ben nieuw in C# (minder dan een week), ik heb de volgende code die een bestand op een volume verwijdert. Het is een back-upbestand voor een SQL-database. En het blijft zo periodiek groeien dat ik het bestand moet hernoemen en het vervolgens moet verwijderen nadat een nieuw bestand is geback-upt. Ik moet evalueren of de back-up is uitgevoerd en dan is het goed om het bestand te verwijderen.

    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
        }
    }
}

Dit is de logica. Als ik teveel vraag, laat het me weten:

  • Als de datum van vandaag = maandag is en het bestand FT_FabTrol_Sun_Full. De datum van.BAK is minder dan 2 dagen oud, dan is het ok om het bestand met de naam FT_Trans_Log_Appendedold.BAK te verwijderen
  • Anders Als de datum van vandaag = dinsdag is en bestand FT_FabTrol_Mon_Full. De datum van BAK is minder dan 2 dagen oud, dan is het ok om het bestand met de naam FT_Trans_Log_Appendedold.BAK te verwijderen
  • Anders Als de datum van vandaag = woensdag is en bestand FT_FabTrol_Tues_Full. De datum van BAK is minder dan 2 dagen oud, dan is het ok om het bestand met de naam FT_Trans_Log_Appendedold.BAK te verwijderen
  • Anders Als de datum van vandaag = donderdag is en het bestand FT_FabTrol_Wed_Full. De datum van BAK is minder dan 2 dagen oud, dan is het ok om het bestand met de naam FT_Trans_Log_Appendedold.BAK te verwijderen
  • Anders Als de datum van vandaag = vrijdag is en bestand FT_FabTrol_Thurs_Full. De datum van.BAK is minder dan 2 dagen oud, dan is het goed om het bestand met de naam FT_Trans_Log_Appendedold.BAK te verwijderen
  • Anders Als de datum van vandaag = zaterdag is en het bestand FT_FabTrol_Fri_Full. De datum van BAK is minder dan 2 dagen oud, dan is het ok om het bestand met de naam FT_Trans_Log_Appendedold.BAK te verwijderen
  • Anders Als de datum van vandaag = zondag is en bestand FT_FabTrol_Sat_Full. De datum van BAK is minder dan 2 dagen oud, dan is het goed om het bestand met de naam FT_Trans_Log_Appendedold.BAK te verwijderen
1
Misschien wilt u bestanden verwijderen die ouder zijn dan twee dagen en de recentere bewaren?
toegevoegd de auteur Steve, de bron
U kunt al die ifs overslaan. Als het bestand niet ouder is dan 2 dagen, verwijder het dan. Is dat correct?
toegevoegd de auteur Andre Calil, de bron
De FileInfo-klasse kan u helpen informatie te krijgen over het maken/wijzigen van datums. msdn.microsoft.com/en-us/library/system. io.fileinfo.aspx
toegevoegd de auteur Gray, de bron
@MichaelTerrian Ik heb mijn antwoord bijgewerkt om aan uw vereisten te voldoen (denk ik). Alleen maar.
toegevoegd de auteur Gray, de bron
Ik heb een antwoord geplaatst dat beide dingen doet.
toegevoegd de auteur Nick Bray, de bron
Nee, aan twee voorwaarden moet worden voldaan. 1) Als de datum van vandaag = zondag 2 is) en bestand FT_FabTrol_Sat_Full. De datum van BAK is minder dan 2 dagen oud, dan is het ok om het bestand met de naam FT_Trans_Log_Appendedold.BAK te verwijderen
toegevoegd de auteur Michael Terrian, de bron

7 antwoord

U kunt die logica aanzienlijk vereenvoudigen met: -

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
toegevoegd

Het enige dat u hoeft te doen is alle bestanden in uw map herhalen en de bestanden verwijderen die ouder zijn dan twee dagen, toch (lijkt dat wel wat uw gigantische voorwaardelijke verklaring is)?

Gebruik dus de volgende regel om alle bestanden in de map te krijgen:

string[] files = Directory.GetFiles();

Vervolgens, in een lus, herhaalt u alle bestandsnamen in bestanden en controleert u of ze oud genoeg zijn.

Om de tijdstempel van het bestand te krijgen, gebruikt u FileInfo en LastWriteTime als volgt:

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

Probeer onderstaande code.

 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
toegevoegd

Ik heb mijn antwoord bijgewerkt om aan uw vereisten te voldoen. Een beetje raar, maar ik verveelde me. Kan nuttig zijn als alleen om te lezen.

//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
toegevoegd

Voortbouwend op wat @Gray heeft opgemerkt, laat het FileInfo-object je ook weten of het .Exists is of niet, waardoor de noodzaak om afhankelijk te zijn van de try/catch afneemt om te weten of een bestand er nog is.

Stel je de volgende situatie voor:

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
toegevoegd

Persoonlijk voor een ervaring van een week zou ik zeggen dat je in het diepe bent gesprongen.

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

  1. Kijk in streamwriter /reader en filewriter en fileinfo.
  2. Hieruit kunt u vervolgens bestanden lezen, verwijderen/hernoemen/wat u maar wilt.
  3. U moet dan proberen te begrijpen hoe ik kan valideren wat ik aan het doen ben . Helaas voor een beginner is dit moeilijker dan je misschien denkt, mogelijk moeilijker dan de eerste twee punten voor sommige mensen. Denk vanaf het simpele moment, wij ontwikkelaars maken de dingen meestal te ingewikkeld. Dit deel is eigenlijk vrij eenvoudig, zolang je bestandsgegevens kloppen!

Misschien wilt u eens kijken naar unit-testen, want dit kan uw validatie helpen.

0
toegevoegd

Deze code 1e controleert of het bestand op basis van de dag minder dan 2 dagen oud is, en als dit het is, wordt het bestand FT_Trans_Log_Appendedold.BAK verwijderd.

                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
toegevoegd
Dit is niet veel beter dan wat het OP al heeft
toegevoegd de auteur dtsg, de bron
Het is in C# wat hij schreef was in woorden. Ik begreep de vraag om te vragen hoe hij zijn if-statement in C# moest schrijven. Ik denk niet dat de vraag was hoe te testen of het 2 dagen oud is.
toegevoegd de auteur Nick Bray, de bron
Plaats dit in het try-blok van uw code.
toegevoegd de auteur Nick Bray, de bron
@MichaelTerrian Ik repareerde het door de extra() in die regel te verwijderen
toegevoegd de auteur Nick Bray, de bron
@MichaelTerrian Oh sorry dat je de rij moet veranderen; string filename = dir;
toegevoegd de auteur Nick Bray, de bron
Nick heeft het geprobeerd maar krijgt fout Methode naam verwacht op deze regel (nieuwe FileInfo (dir + "FT_Trans_Log_Appendold.BAK") ()). Verwijderen ();
toegevoegd de auteur Michael Terrian, de bron
Oké, ik zal het proberen, bedankt
toegevoegd de auteur Michael Terrian, de bron
Bij het debuggen krijg ik de fout Fout "Gebruik van niet-toegewezen lokale variabele 'fileName'"
toegevoegd de auteur Michael Terrian, de bron
Ik kan de fout doorspitten als ik dit aan string bestandsnaam = Path.GetFileName (@ "\\ Fabtrol-2 \ Program Files (x86) \ FabTrolBackUp \");
toegevoegd de auteur Michael Terrian, de bron
Nick die het heeft gedaan. Ik moest een beetje meer tweaken, maar het werkt zoals ik het nodig heb. Hartelijk bedankt.
toegevoegd de auteur Michael Terrian, de bron