2016-06-10 72 views
0

我参加了一个C#课程,目前的任务是创建一个控制台应用程序,用于从目录“客户订单”传输新文件(在过去24小时内修改)到目录“家庭办公室”。在过去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(); 
    } 

能有人好心指出,这里发生了什么,并把我在正确的轨道上?

+1

追加.ToList()到linq – LamonteCristo

+0

后添加ToList,使用foreach对WriteLine的所有结果进行循环。 – Berkay

+0

谢谢你,工作。 –

回答

0

什么情况是,在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; 
     } 
    } 
} 
0

按照该意见,我添加.ToList()我的方法的返回语句,然后创建主这个foreach循环:

foreach (var file in newFiles.modified()) 
{ 
    Console.WriteLine(file); 
} 
相关问题