if оператори для оцінки декількох дат файлів

Я новачок у C# (менше тижня), у мене є наступний код, який видаляє файл на тому томі. Це резервний файл для бази даних SQL. І вона постійно зростає, тому періодично я маю перейменувати файл, а потім видалити його після того, як новий файл буде створено. Мені потрібно оцінити, чи виконувалося резервне копіювання, а потім видаляти файл.

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

Це логіка. Якщо я надто багато прошу, дайте мені знати:

  • Якщо сьогоднішня дата = понеділок, а дата файлу FT_FabTrol_Sun_Full.BAK менше 2 днів, то ви можете видалити файл з ім'ям FT_Trans_Log_Appendedold.BAK
  • Інакше, якщо сьогоднішня дата = вівторок, і дата файлу FT_FabTrol_Mon_Full.BAK менше 2 днів, то ви можете видалити файл з ім'ям FT_Trans_Log_Appendedold.BAK
  • Інакше, якщо сьогоднішня дата = середа, а дата файлу FT_FabTrol_Tues_Full.BAK менше 2 днів, ви можете видалити файл з ім'ям FT_Trans_Log_Appendedold.BAK
  • Інакше, якщо сьогоднішня дата = Четвер, а дата файлу FT_FabTrol_Wed_Full.BAK менше 2 днів, то ви можете видалити файл з ім'ям FT_Trans_Log_Appendedold.BAK
  • Інакше, якщо сьогоднішня дата = п'ятниця, а дата файлу FT_FabTrol_Thurs_Full.BAK менше 2 днів, то ви можете видалити файл з ім'ям FT_Trans_Log_Appendedold.BAK
  • Інакше, якщо сьогоднішня дата = субота, і дата файлу FT_FabTrol_Fri_Full.BAK менше 2 днів, то ви можете видалити файл з ім'ям FT_Trans_Log_Appendedold.BAK
  • Інакше, якщо сьогоднішня дата = неділя, а дата файлу FT_FabTrol_Sat_Full.BAK менше 2 днів, то ви можете видалити файл з ім'ям FT_Trans_Log_Appendedold.BAK
1
Можливо, ви хочете видалити файли старше двох днів і зберегти новіші?
додано Автор Steve, джерело
Можна пропустити всі ці ifs . Якщо файл не старше 2 днів, видаліть його. Це правильно?
додано Автор Andre Calil, джерело
Клас FileInfo може допомогти отримати інформацію про створення/зміну дат.
додано Автор Gray, джерело
@MichaelTerrian Я оновив свою відповідь відповідно до ваших вимог (я думаю). Просто fyi.
додано Автор Gray, джерело
Я відправив відповідь, що робить обидві речі.
додано Автор Nick Bray, джерело
Ні, необхідно виконати дві умови. 1) Якщо сьогоднішня дата = Неділя 2) і дата файлу FT_FabTrol_Sat_Full.BAK менше 2 днів, то ви можете видалити файл з ім'ям FT_Trans_Log_Appendedold.BAK
додано Автор Michael Terrian, джерело

7 Відповіді

Ви можете значно спростити цю логіку за допомогою: -

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
додано

Все, що вам потрібно зробити, це повторити всі файли у вашій папці і видалити ті, які старше двох днів, так (це, здається, те, до чого доводиться ваш гігантський умовний оператор)?

Отже, використовуйте наступний рядок, щоб отримати всі файли в папці:

string[] files = Directory.GetFiles();

Потім у циклі переглядайте всі імена файлів у файлах і перевіряйте, чи достатньо вони старі.

Щоб отримати мітку часу файлу, використовуйте FileInfo і LastWriteTime так:

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

Спробуйте код нижче.

 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
додано

Оновили свою відповідь, щоб задовольнити ваші вимоги. Незрозуміло, але мені було нудно. Може бути корисно, якщо просто читати.

//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
додано

Опираючись на те, що прокоментував @Gray, об'єкт FileInfo також дасть вам знати, чи це .Exists чи ні, полегшуючи необхідність залежати від try/catch, щоб дізнатися, чи є файл ще.

Розгляньте наступне:

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
додано

Особисто за один тиждень досвіду я б сказав, що ви стрибнули в глибокий кінець.

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

  1. Перегляньте потоковий редактор /читач і автор файлів і fileinfo.
  2. З цього можна прочитати файли, видалити/перейменувати/що завгодно.
  3. Потім потрібно спробувати зрозуміти як я можу перевірити, що я роблю . На жаль, для новачків це важче, ніж ви думаєте, можливо, важче, ніж перші два моменти для деяких людей. Подумайте від простих далі, ми, розробники, зазвичай ускладнюємо. Ця частина насправді досить проста так довго, що ваш файл є правильним!

Можливо, ви захочете розглянути модульне тестування, оскільки це може допомогти вашій перевірці.

0
додано

Цей код 1 перевіряє, якщо файл, заснований на день, не перевищує 2 днів, тоді якщо він видаляє файл 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
додано
Це не набагато краще, ніж те, що вже є в ОП
додано Автор dtsg, джерело
Саме в C# він написав слова. Я зрозумів питання, щоб запитати, як написати його, якщо в C #. Я не думаю, що питання про те, як перевірити, якщо це 2 дні.
додано Автор Nick Bray, джерело
Помістіть це у блоці try.
додано Автор Nick Bray, джерело
@MichaelTerrian Я виправив це, видаливши додаткову() у цьому рядку
додано Автор Nick Bray, джерело
@MichaelTerrian Ой, вибачте, ви повинні змінити лінію; string filename = dir;
додано Автор Nick Bray, джерело
Нік спробував це, але отримав ім'я методу помилки, що очікується на цьому рядку (новий FileInfo (dir + "FT_Trans_Log_Appendedold.BAK") ()). Видалити ();
додано Автор Michael Terrian, джерело
Гаразд я дам йому спробу спасибі
додано Автор Michael Terrian, джерело
Під час налагодження отримую помилку "Помилка" Використання непризначеної локальної змінної 'fileName' "
додано Автор Michael Terrian, джерело
Я можу отриматипомилка, якщо додати це до рядка filename = Path.GetFileName (@ ". Fabtrol-2 Програмні файли (x86)" FabTrolBackUp ");
додано Автор Michael Terrian, джерело
Нік, який зробив свій трюк. Я повинен був зробити трохи більше tweaking але це працює шлях я потребую це. Дуже дякую.
додано Автор Michael Terrian, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug