Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除早于某些天数的文件_C# - Fatal编程技术网

C# 删除早于某些天数的文件

C# 删除早于某些天数的文件,c#,C#,我想这是一个应用程序中非常常见的需求,它需要进行大量的日志记录。我正在开发一个C#Windows应用程序.NET3.5 我的应用程序生成大量日志文件,文件名中有一个当前日期,如so 20091112。删除超过30天的文件的最佳策略是什么。 我将要使用的一种方法是循环遍历文件名,提取日期部分,转换为DateTime对象,并与今天的日期进行比较。 是否有一个优雅的正则表达式解决方案:)?或者更好的方法?减去两个DateTime对象将得到一个TimeSpan对象,然后您可以只检查其TotalDays属

我想这是一个应用程序中非常常见的需求,它需要进行大量的日志记录。我正在开发一个C#Windows应用程序.NET3.5

我的应用程序生成大量日志文件,文件名中有一个当前日期,如so 20091112。删除超过30天的文件的最佳策略是什么。 我将要使用的一种方法是循环遍历文件名,提取日期部分,转换为DateTime对象,并与今天的日期进行比较。
是否有一个优雅的正则表达式解决方案:)?或者更好的方法?

减去两个
DateTime
对象将得到一个
TimeSpan
对象,然后您可以只检查其
TotalDays
属性。我想不出比这更简单的了。

据我所知,您希望使用文件名而不是修改时间。好的

var files = new DirectoryInfo(@"c:\log").GetFiles("*.log");
foreach (var file in files)
{
    if (DateTime.UtcNow - file.CreationTimeUtc > TimeSpan.FromDays(30))
    {
        File.Delete(file.FullName);
    }
}
string directoryPath = "/log"; // your log directory path

foreach (string filePath in Directory.GetCreationTime(directoryPath))
{
    TimeSpan fileAge = File.GetLastWriteTime(filePath) - DateTime.Now;
    if (fileAge.Days > 30)
    {
        File.Delete(filePath);
    }
}
那么代码是这样的:

    foreach (string file in Directory.GetFiles(path))
    {
        string fileNameOnly=Path.GetFileNameWithoutExtension(file);
        DateTime fileDate = DateTime.ParseExact(fileNameOnly, "yyyyMMDD", CultureInfo.CurrentCulture);
        if (DateTime.Now.Subtract(fileDate).TotalDays > MaxDays)
            File.Delete(file);
    }

[在PowerShell中]您可以将以下内容粘贴到PS1文件中,并使其成为管理脚本的一部分(如果合适):-

param($path=$(抛出“需要指示路径”),$daysToRetain=$(抛出“需要指示保留多少天”))

dir$path-r |?{([datetime]::UtcNow-$\ CreationTimeUtc).TotalDays-gt$daystorain}del


编辑:如果您觉得使用文件时间不是正确的做法,您可以使用
-match
来解析名称

更新.net 4.0:

var files = new DirectoryInfo(directoryPath).GetFiles("*.log");
foreach (var file in files.Where(file => DateTime.UtcNow - file.CreationTimeUtc > TimeSpan.FromHours(2))) {
     file.Delete();
}
string[]files=Directory.GetFiles(路径);
foreach(文件中的字符串文件)
{
if(File.GetLastWriteTime(File)
只是我必须获取内存中的所有FileInfo对象才能执行此操作。我只是想知道名字,因为里面有日期。这听起来合理吗?我想你可以与
FindFirstFile
FindNextFile
API进行互操作,或者看看.NET 4.0,在那里你可以使用
DirectoryInfo.EnumerateFiles
,它返回一个
IEnumerable
。FileInfo对象没有那么重——它们不是文件句柄或任何东西。例如,PowerShell将它们用于流经管道的目录条目。如果我们想说它的时间超过几个小时或几年呢?有类似TimeSpan.FromYears或TimeSpan.FromHours的东西吗?如果有的话,这将是一件非常容易的事情,也可以+1simplicity@BerkerYüceer,有
TimeSpan.FromHours
。这就是我现在代码中的内容。我只是有一个想法,我在一组字符串中有一个日期模式,我需要比较,我也许可以使用正则表达式,但是我似乎需要使用FraceRoop方法。请考虑添加一些解释,而不仅仅是答案中的原始代码。您可能还想解释您的答案添加到现有答案中的内容。
string[] files = Directory.GetFiles(path);
foreach (string file in files)
 {
  if (File.GetLastWriteTime(file) < DateTime.Now.AddDays(-5))
    {
      File.Delete(file);
    }
 }