0

私は C# コースを受講しており、現在の課題は、新しいファイル (過去 24 時間に変更されたファイル) をディレクトリ "Customer Orders" からディレクトリ "Home Office" に転送するコンソール アプリケーションを作成することです。

この時点で、どのファイルが新しいかを把握する方法を考え出そうとしています。動作するかどうかを確認するために、Console.WriteLine を使用して新しいファイルをコンソール ウィンドウに出力しています。ただし、「System.Linq.Enumerable+WhereArrayIterator'1[System.IO.FileInfo]」を出力するだけです。

私はこの言語に非常に慣れていないので、すでにすべてを間違った方法で行っているのではないかと心配しています。これまでの私のコードは次のとおりです(1時間のグーグル検索と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();
    }

誰かがここで何が起こっているのかを親切に指摘して、私を正しい軌道に乗せることができますか?

4

2 に答える 2

0

何が起こるかというと、C# のすべての型ToStringはメソッドを継承し、オーバーライドしない限り、オブジェクトのデフォルトの文字列表現であるその名前 typeを出力します。

参照:

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;
        }
    }
}
于 2016-06-10T23:27:15.337 に答える
0

コメントに従って、.ToList()メソッドの return ステートメントに追加し、Main でこの foreach ループを作成しました。

foreach (var file in newFiles.modified())
{
    Console.WriteLine(file);
}
于 2016-06-10T23:20:04.267 に答える