【问题标题】:Get files within a folder, within another folder?获取文件夹中的文件,另一个文件夹中的文件?
【发布时间】:2018-12-14 20:29:13
【问题描述】:

我正在尝试为自己创建一个检查“C:\Logs”目录的迷你工具

C:\Logs 中,我有许多随机名称的文件夹。我希望能够检查 C:\Logs 内的所有文件夹,并在这些文件夹中检查创建的日期是否过时,以便我可以通过编程方式删除它们。

这是我目前所拥有的......

Try
    Dim CreatedDate As DateTime
    Dim Todays_Date As DateTime = Today.Date
    Dim DirInfo As DirectoryInfo
    Dim Time_Span As TimeSpan
    Dim DirList As New List(Of String)

    For Each SubDir As String In Directory.GetDirectories("C:\Logs")
        DirInfo = New DirectoryInfo(SubDir)
        CreatedDate = DirInfo.CreationTimeUtc

        Time_Span = Todays_Date - CreatedDate

        If Time_Span .Days > 10 Then
          DirList .Add(SubDir)
          DirInfo.Delete(True)
        Else
          'No Dir found or Dir is not  > 10
        End If
    Next
End Try

目前这会从 C:\Logs 中获取所有文件夹,并删除任何超过 10 天的文件夹。但是,我只想在 C:\Logs\ ****

中删除 FILES

因为我有一个来自 C:\ via 的文件夹列表:

For Each SubDir As String In Directory.GetDirectories("C:\Logs")

我是否必须这样做才能获取这些文件夹中的所有文件?

        For Each SubFile As String In Directory.GetFiles(SubDir)
            'Check date of each file and delete if older than 10 days?
        Next

【问题讨论】:

  • 在实际状态下,您只会读取C:\Logs根目录中的子文件夹。如果你想浏览整个目录树,你必须编写一个递归函数,即:一个调用自身的函数。示例:support.microsoft.com/en-us/help/306666/…
  • 我真的很讨厌递归函数哈哈!我的教授是对的,但有时它们很有用
  • 递归函数可能很危险,但在某些情况下是必要的。
  • 是真的吗?我的印象是很多文件夹是文件夹C:/Logs,并且结构不超过两个文件夹。是吗?
  • For Each SubDir As String In Directory.GetDirectories("C:\Logs","*",SearchOption.AllDirectories)怎么样

标签: vb.net visual-studio vb.net-2010


【解决方案1】:

您走在正确的轨道上,您建议的内部循环是正确的,您还需要一件事是 FileInfo 类,它可以获取有关文件的元数据,您的操作与文件夹相同。

【讨论】:

  • 由于已经过去了几个小时,没有其他人发表评论,我将其标记为答案,谢谢!
【解决方案2】:
Sub TestIO()
    Dim fld As New DirectoryInfo("C:\Logs")
    fld.EnumerateFiles().
        Where(Function(f) (Date.Now - f.CreationTimeUtc) > TimeSpan.FromDays(10)).
        ToList().
        ForEach(Sub(f) f.Delete())
End Sub

更新

要摆脱 ToList 调用以使用方便的 ForEach 方法,您可以添加可直接与 IEnumerable 一起使用的扩展方法(这在 .NET Framework 中很受欢迎)。此扩展方法如下所示:

public static class ExtensionMethods
{
    public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
    {
        if (enumerable == null)
        {
            throw new ArgumentException($"Argument {nameof(enumerable)} is null.");
        }

        using (var enumerator = enumerable.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                action(enumerator.Current);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多