【问题标题】:Delete files which are older than today's date删除早于今天日期的文件
【发布时间】:2016-04-27 02:08:17
【问题描述】:

我在特定位置有一些格式为“yyyyMMdd_hhmmss_abc.txt”的文件。 使用下面的代码,我可以在该文件夹中获取所有带有“_abc.txt”的文件。

fileArray = Directory.GetFiles(@"C://Documents", "*abc.txt");
for (int i = 0; i < fileArray.Length; i++)
{
    fileArray[i] = Path.GetFileNameWithoutExtension(fileArray[i]);
    Console.WriteLine(fileArray[i]);
}

但现在我正在考虑读取文件名,将其拆分然后转换为日期时间对象,以便我可以检查条件(早于今天的日期)并删除它们。

for eg: 20160426_045823_abc.txt

我想将其拆分为 2016, 04 , 26 ,然后使用转换为日期时间对象 Datetime d1 = new Datetime(2016,04,26) 然后进行其他操作。

有没有其他方法可以解决这个问题?

提前致谢

【问题讨论】:

标签: c# arrays string datetime split


【解决方案1】:

以下代码可用于获取创建日期小于今天日期的文件集合,对集合的简单迭代也将帮助您删除它们:考虑代码

简单的选项:

foreach (var item in Directory.GetFiles(@"C://Documents", "*.txt")
                               .Where(x => new FileInfo(x).CreationTime.Date  < DateTime.Now.Date))
{
    File.Delete(item);
} 

基于文件名:

var fileArray = Directory.GetFiles(@"C://Documents", "*abc.txt");
for (int i = 0; i < fileArray.Length; i++)
{
    DateTime fileNameTime;
    string fileName = Path.GetFileNameWithoutExtension(fileArray[i]).Replace("_abc", " ");
    fileNameTime = DateTime.ParseExact("yyyyMMdd_hhmmss", fileName, CultureInfo.InvariantCulture, DateTimeStyles.None);
    if (fileNameTime.Date < DateTime.Now.Date)
    {
        File.Delete(fileArray[i]);
    }
}

请注意:最好和有效的选项是第一个,您需要做的是将文件名指定为日期时间 创建文件(如果它在您的控制之下),以便事情 对你来说变得更容易了

【讨论】:

  • 可能想用CreationTime.Date和DateTime.Now.Date,除非你想删除所有文件:)
  • @gnalck:谢谢,好地方。我已经更新了答案
  • 感谢您的回复:) 我正在寻找文件名而不是创建时间。
  • @un-lucky 在这里我们只是比较日期是否小于今天的日期。如果我必须检查 5 天前的状况怎么办?我试过这个: if (DateTime.Now.Date - d5.Date > TimeSpan.FromDays(5)) { Console.WriteLine(fileArray[i]); File.Delete(fileArray[i]);但该文件没有被删除。这里有什么要调整的吗?
  • 使用DateTime.Now.AddDays(-5).Date 代替DateTime.Now
【解决方案2】:

文件名已经是基于日期的可排序格式。与其将文件名的位解析为 DateTime 对象,不如根据今天的日期创建文件名并将文件名数组过滤为仅比今天的日期文件名字符串比较少的文件名?对于大型文件列表,这可能比对每个文件名进行日期解析要快得多。

例如:

var path = "c:\\whatever";
var suffix = "_abc.txt";
var todaysFilename = DateTime.Now.ToString("yyyyMMdd_hhmmss") + suffix;
var filesToDelete = Directory.EnumerateFiles(path, "*" + suffix)
    .Select(Path.GetFileName)
    .Where(fileName => string.Compare(fileName, todaysFilename, StringComparison.Ordinal) < 0)
    .ToArray();

foreach (var file in filesToDelete)
{
    File.Delete(Path.Combine(path, file));
}

【讨论】:

  • 感谢您的回答。如果我必须删除比今天日期早 5 天的文件怎么办?你的代码中是 5 而不是 0?
  • 不,Compare 函数在第一个参数小于时返回小于零的值,在它们相等时返回零,在第二个参数小于时返回大于零的值。你想要做的是:var todayFilename = DateTime.Now.AddDays(-5).ToString(...)。这将删除所有超过 5 天的文件。
【解决方案3】:

您可以获取字符串的名称并执行 DateTime.ParseExact。

String dateString = Path.GetFileNameWithoutExtension(fileArray[i])
DateTime d5 = DateTime.ParseExact(dateString, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None)
if (d5.Date < DateTime.Now.Date)
{
    File.Delete(fileArray[i]);
}

这将获取字符串的前 8 个字符并 parse 对其进行精确解析。 此外,您可能只想要没有路径和扩展名的文件名。

https://msdn.microsoft.com/en-us/library/w2sa9yss%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

【讨论】:

  • 如果创建日期是您想要比较其他答案的日期可能会更好,但如果文件名中的日期是您想要的而不是实际创建日期,则从字符串更好。
  • 嗨 Arina.. 我试过你的方法。但它抛出一个错误..“字符串未被识别为有效的日期时间。”获得文件名后,我这样做了。 DateTime d5 = DateTime.ParseExact("yyyyMMdd", fileArray[i], CultureInfo.InvariantCulture, DateTimeStyles.None); Console.WriteLine(d5);
  • 您可能必须截断文件名才能将其转换为准确的格式。 DateTime d5 = DateTime.ParseExact("yyyyMMdd", fileArray[i].SubString(0, 8), CultureInfo.InvariantCulture, DateTimeStyles.None)
  • 嗨 Arina.. 是否有任何要为 stringtool 添加的参考?因为它没有显示相同的潜在修复。 TIA
  • 我认为你需要稍微调整一下你的答案。 DateTime d5 = DateTime.ParseExact(filename,"yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None);
【解决方案4】:

您可以像这样获取文件创建的日期时间

DateTime time = File.GetCreationTime(fileName);

是的,就是这么简单。

【讨论】:

  • 嗨 JSON。当我尝试此代码时,为什么它显示 1/1/1601 8:00:00 AM 作为创建日期。我还有什么需要做的吗/
  • 您的文件名可能不正确。确保包含整个路径。如果你喜欢我的答案标记为已回答并让我兴奋
猜你喜欢
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 2023-02-16
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多