将最近 24 小时内修改的文件打印到控制台
Print files modified in the last 24 hours to the console
我正在学习 C# 课程,当前的任务是创建一个控制台应用程序,用于将新文件(在过去 24 小时内修改)从目录 "Customer Orders" 传输到目录 "Home Office"。
此时我只是想想出一种方法来找出哪些文件是新的。为了查看它是否有效,我使用 Console.WriteLine 将新文件打印到控制台 window。然而,它所做的只是打印 "System.Linq.Enumerable+WhereArrayIterator'1[System.IO.FileInfo]".
我对这门语言非常陌生,我担心我已经以错误的方式处理所有事情。到目前为止,这是我的代码(经过一个小时的谷歌搜索并从 Whosebug 获取想法):
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()
添加到我的方法的 return 语句中,然后在 Main:
中创建了这个 foreach 循环
foreach (var file in newFiles.modified())
{
Console.WriteLine(file);
}
发生的事情是 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;
}
}
}
我正在学习 C# 课程,当前的任务是创建一个控制台应用程序,用于将新文件(在过去 24 小时内修改)从目录 "Customer Orders" 传输到目录 "Home Office"。
此时我只是想想出一种方法来找出哪些文件是新的。为了查看它是否有效,我使用 Console.WriteLine 将新文件打印到控制台 window。然而,它所做的只是打印 "System.Linq.Enumerable+WhereArrayIterator'1[System.IO.FileInfo]".
我对这门语言非常陌生,我担心我已经以错误的方式处理所有事情。到目前为止,这是我的代码(经过一个小时的谷歌搜索并从 Whosebug 获取想法):
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()
添加到我的方法的 return 语句中,然后在 Main:
foreach (var file in newFiles.modified())
{
Console.WriteLine(file);
}
发生的事情是 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;
}
}
}