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类可以帮助您获取有关创建/修改日期的信息。 msdn.microsoft.com/en-us/library/system。 io.fileinfo.aspx
额外 作者 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();

然后,在循环中,遍历 files 中的所有文件名,并检查它们是否足够大。

要获取文件的时间戳,请使用 FileInfoLastWriteTime ,如下所示:

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. 查看 streamwriter /reader and filewriter and FileInfo的。
  2. 然后你就可以读取文件,删除/重命名/你想要的任何东西。
  3. 然后,您需要尝试理解如何验证我正在做的事情。 不幸的是,初学者这比你想象的要难,可能比某些人的前两点更难。从简单的角度思考,我们的开发人员通常会过于复杂化。这部分实际上相当容易,因为你的文件正确无误!

您可能需要查看单元测试,因为这可能有助于您的验证。

0
额外

此代码首先检查基于当天的文件是否少于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
额外
这并不比OP已有的好多少
额外 作者 dtsg,
在C#中他用文字写的是什么。我理解的问题是如何将他的if语句写入c#。我不认为问题是如何测试它是否是2天。
额外 作者 Nick Bray,
把它放在代码的try块中。
额外 作者 Nick Bray,
@MichaelTerrian我通过删除该行中的extra()来修复它
额外 作者 Nick Bray,
@MichaelTerrian哦对不起,你必须换线; string filename = dir;
额外 作者 Nick Bray,
尼克尝试了它,但得到错误方法名称在这一行上预期(新的FileInfo(dir +“FT_Trans_Log_Appendedold.BAK”)())。删除();
额外 作者 Michael Terrian,
好的,我会试试谢谢
额外 作者 Michael Terrian,
在debuging时我得到错误错误“使用未分配的局部变量'fileName'”
额外 作者 Michael Terrian,
如果我将其添加到字符串filename = Path.GetFileName(@“\\ Fabtrol-2 \ Program Files(x86)\ FabTrolBackUp \”),我可以得到错误。
额外 作者 Michael Terrian,
尼克做了这个伎俩。我不得不做一些调整,但它按照我需要的方式工作。非常感谢。
额外 作者 Michael Terrian,