2016-06-10 13 views
0

Ich nehme einen C# -Kurs und die aktuelle Aufgabe besteht darin, eine Konsolenanwendung zu erstellen, die neue Dateien (geändert in den letzten 24 Stunden) aus dem Verzeichnis "Kundenaufträge" überträgt. zum Verzeichnis "Home Office".Drucken von Dateien, die in den letzten 24 Stunden geändert wurden, an die Konsole

An diesem Punkt versuche ich nur einen Weg zu finden, welche Dateien neu sind. Um zu sehen, ob es funktioniert, verwende ich Console.WriteLine, um neue Dateien in das Konsolenfenster zu drucken. Es wird jedoch nur "System.Linq.Enumerable + WhereArrayIterator'1 [System.IO.FileInfo]" gedruckt.

Ich bin unglaublich neu in dieser Sprache, und ich mache mir Sorgen, dass ich schon alles falsch mache. Hier ist mein Code so weit (nach einer Stunde googeln und bekommen Ideen von 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(); 
    } 

Kann jemand freundlicherweise darauf hinweisen, was hier geschieht und mich auf dem richtigen Weg?

+1

anhängen .ToList() zu der Linq – LamonteCristo

+0

nach Add ToList, machen Sie eine Schleife zu WriteLine alle Ergebnisse mit foreach. – Berkay

+0

Danke Jungs, das hat funktioniert. –

Antwort

0

Was passiert ist, dass jede Art in C# die ToString Methode erben , die , es sei denn, overriden wird eine Standard-String-Darstellung des Objekts drucken: sein Name Typ.

Referenz:

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

Hier sind vier Beispiele, aus Druck jeden Dateinamen und zeigt das Standardverhalten von ToString und eine überschriebene Verhalten:

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

sich nach den Kommentaren, fügte ich .ToList() auf die return-Anweisung meiner Methode und erstellt dann diese foreach-Schleife in Main:

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