【问题标题】:Print files modified in the last 24 hours to the console将最近 24 小时内修改的文件打印到控制台
【发布时间】:2016-06-10 23:09:36
【问题描述】:

我正在学习 C# 课程,当前的任务是创建一个控制台应用程序,用于将新文件(在过去 24 小时内修改)从目录“客户订单”传输到目录“家庭办公室”。

此时,我只是想找出一种方法来确定哪些文件是新文件。为了查看它是否有效,我使用 Console.WriteLine 将新文件打印到控制台窗口。但是,它所做的只是打印“System.Linq.Enumerable+WhereArrayIterator'1[System.IO.FileInfo]”。

我对这种语言非常陌生,而且我担心我已经以错误的方式处理所有事情。这是我到目前为止的代码(经过一个小时的谷歌搜索并从 StackOverflow 获得想法):

    class ModifiedFiles
    {
        public string your_dir;

        public IEnumerable<FileInfo> modified()
        {
            your_dir = @"C:\Users\Student\Desktop\Customer Orders";
            var directory = new DirectoryInfo(your_dir);
            DateTime from_date = DateTime.Now.AddDays(-1);
            DateTime to_date = DateTime.Now;
            var files = directory.GetFiles()
              .Where(file => file.LastWriteTime >= from_date && file.LastWriteTime <= to_date);
            return files;
        }
    }
    static void Main(string[] args)
    {
        ModifiedFiles newFiles = new ModifiedFiles();
        Console.WriteLine(newFiles.modified());
        Console.ReadLine();
    }

有人可以指出这里发生的事情并让我走上正确的道路吗?

【问题讨论】:

  • 追加 .ToList() 到 linq
  • 添加ToList后,使用foreach循环WriteLine所有结果。
  • 谢谢大家,成功了。

标签: c# linq file directory datemodified


【解决方案1】:

发生的情况是,C# 中的每种类型 都继承了ToString 方法,除非 覆盖该方法将打印对象的默认字符串表示:它的名称类型

参考:

https://msdn.microsoft.com/en-us/library/system.object.tostring(v=vs.110).aspx

现在这里有 4 个示例,打印出每个文件名,并显示 ToString 的默认行为和被覆盖的行为:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace MyConsole
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var path = Environment.CurrentDirectory;
            var fromDate = DateTime.Now.AddDays(-1);
            var toDate = DateTime.Now;

            var files = MyClass.GetModifiedFiles(path, fromDate, toDate);

            //System.Linq.Enumerable+WhereArrayIterator`1[System.IO.FileInfo]
            Console.WriteLine(files);

            //System.Collections.Generic.List`1[System.IO.FileInfo]
            Console.WriteLine(files.ToList());

            //MyConsole.exe
            //MyConsole.exe.config
            //MyConsole.pdb
            //MyConsole.vshost.exe
            //MyConsole.vshost.exe.config
            foreach (var file in files)
            {
                Console.WriteLine(file.Name);
            }

            //MyConsole.exe
            //MyConsole.exe.config
            //MyConsole.pdb
            //MyConsole.vshost.exe
            //MyConsole.vshost.exe.config    
            var myClass = new MyClass();
            myClass.FindModifiedFiles(path, fromDate, toDate);
            Console.WriteLine(myClass); // .ToString implicitly called

            Console.ReadLine();
        }
    }

    internal class MyClass
    {
        private IEnumerable<FileInfo> _modifiedFiles;

        public void FindModifiedFiles(string path, DateTime fromDate, DateTime toDate)
        {
            _modifiedFiles = GetModifiedFiles(path, fromDate, toDate);
        }

        /* overriding default implemenation of ToString */

        /// <summary>Returns a string that represents the current object.</summary>
        /// <returns>A string that represents the current object.</returns>
        /// <filterpriority>2</filterpriority>
        public override string ToString()
        {
            return string.Join(Environment.NewLine, _modifiedFiles.Select(s => s.Name));
        }

        public static IEnumerable<FileInfo> GetModifiedFiles(string path, DateTime fromDate, DateTime toDate)
        {
            if (path == null) throw new ArgumentNullException(nameof(path));
            var directory = new DirectoryInfo(path);
            var files = directory.GetFiles()
                .Where(file => file.LastWriteTime >= fromDate && file.LastWriteTime <= toDate);
            return files;
        }
    }
}

【讨论】:

    【解决方案2】:

    根据 cmets,我在方法的 return 语句中添加了 .ToList(),然后在 Main 中创建了这个 foreach 循环:

    foreach (var file in newFiles.modified())
    {
        Console.WriteLine(file);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 2013-09-30
      • 2022-12-04
      • 2015-09-06
      相关资源
      最近更新 更多