if语句来评估多个文件日期
本文关键字:文件 日期 评估 语句 if | 更新日期: 2023-09-27 18:20:18
我是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的文件
- 否则,如果今天的日期=Sunday,并且文件FT_FabTrol_Sat_Full.BAK的日期不到2天,则可以删除名为FT_Trans_Log_Appendedold.BAK的文件
您可以使用以下功能极大地简化该逻辑:-
FileInfo info = new FileInfo(@"''Fabtrol-2'Program Files (x86)'FabTrolBackUp'FT_Trans_Log_Appendedold.BAK");
if(DateTime.Now.AddDays(-2) > info.LastWriteTime.Date)
{
//Delete
}
您所需要做的就是迭代文件夹中的所有文件,并删除超过两天的文件,对吧(这似乎就是您庞大的条件语句的含义)?
因此,使用以下行获取文件夹中的所有文件:
string[] files = Directory.GetFiles(<folder name>);
然后,在循环中,迭代files
中的所有文件名,并检查它们是否足够旧。
要获取文件的时间戳,请使用FileInfo
和LastWriteTime
,如下所示:
if(DateTime.Today - someFileInfoObject.LastWriteTime.Date > new TimeSpan(2,0,0,0))
{
File.Delete();
}
此代码首先检查基于日期的文件是否小于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");
}
就我个人而言,对于一周的经验,我认为你已经跳到了最深处。
我不打算提供代码,而是指导你改进你的学习,这就是所谓的psuedo代码
- 查看streamwritter/reader、filewritter和fileinfo
- 然后你可以从中读取文件,删除/重命名/任何你想要的东西
- 然后,您需要尝试并理解我如何验证我正在做的事情。不幸的是,对于初学者来说,这比你想象的要难,对一些人来说,可能比前两点更难。从简单的方面考虑,我们开发人员通常会把事情复杂化。只要你的文件内容是正确的,这个部分实际上相当容易
您可能需要研究单元测试,因为这可能有助于您的验证。
在@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
}
}
}
请尝试以下代码。
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();
}
更新了我的答案以满足您的要求。有点奇怪,但我很无聊。如果只是阅读可能会有所帮助。
//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);
}