2016-06-10 51 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); 
} 
相關問題