PR

【C#】ファイルリストを取得し特定のファイルを削除

【C#】
広告

C#でフォルダ内の最新のファイル以外を削除し、直近に作成したファイルのみを操作したいという要望がありました。

大まかな処理方法は想定できましたが、今回もいろいろと検証する時間がなかったので、次のAIにコード生成をお願いしてみました。

  • Bing AI
  • ChatGPT
  • Bard

似たようなことでお悩みの方はご参考にどうぞ。

AIへの依頼内容(ファイルリストの操作)

今回は、ファイルが0件の場合、また同時刻のファイルが存在した場合の考慮を踏まえ、次のようにコード生成を依頼しました。

フォルダを指定して直近に作成されたファイル以外を削除し残ったファイルのみを操作したい。
ファイルが0件の場合は何も処理をおこわずに、同時刻のファイルが存在した場合はファイル名の昇順で最後のファイルだけを残したい。

Bing AI の回答(ファイルリストの操作)

指定されたフォルダ内のファイルを削除するには、次のようなC#コードを使用できます。このコードは、指定されたフォルダ内の最新のファイル以外のすべてのファイルを削除します。

string folderPath = "C:\\your\\folder\\path"; // フォルダパスを指定してください
DirectoryInfo directory = new DirectoryInfo(folderPath);
FileInfo[] files = directory.GetFiles();
if (files.Length > 0)
{
    DateTime latestWriteTime = files[0].LastWriteTime;
    FileInfo latestFile = files[0];
    foreach (FileInfo file in files)
    {
        if (file.LastWriteTime > latestWriteTime)
        {
            latestWriteTime = file.LastWriteTime;
            latestFile = file;
        }
    }
    foreach (FileInfo file in files)
    {
        if (file.Name != latestFile.Name)
        {
            file.Delete();
        }
    }
}

このコードは、指定されたフォルダ内の最新のファイル以外のすべてのファイルを削除します。ただし、同時刻に作成された複数のファイルがある場合、最後に作成されたファイルだけが残ります。これは、GetFilesメソッドが返すFileInfo配列が、ファイル名の昇順で並べ替えられるためです。このコードは、指定されたフォルダ内にファイルがない場合、何も処理しません。

ChatGPT の回答(ファイルリストの操作)

理解しました。指定したフォルダ内で直近に作成されたファイル以外を削除し、ファイルが0件の場合や同時刻のファイルが存在する場合はファイル名の昇順で最後のファイルだけを残す処理を行うサンプルコードを以下に示します。

using System;
using System.IO;
using System.Linq;

class Program
{
    static void Main()
    {
        string folderPath = @"C:\Example"; // 操作対象のフォルダのパスを指定
        DeleteOldFilesExceptRecent(folderPath);
    }

    static void DeleteOldFilesExceptRecent(string folderPath)
    {
        try
        {
            // フォルダ内の全てのファイルを取得
            DirectoryInfo directory = new DirectoryInfo(folderPath);
            FileInfo[] files = directory.GetFiles();

            // ファイルが0件の場合は何もせず終了
            if (files.Length == 0)
            {
                Console.WriteLine("フォルダ内にファイルが存在しません。");
                return;
            }

            // 同時刻のファイルが存在する場合はファイル名の昇順で最後のファイルを取得
            FileInfo lastFile = files.OrderBy(f => f.Name).Last();

            // 直近に作成されたファイル以外を削除
            foreach (FileInfo file in files)
            {
                if (file != lastFile)
                {
                    file.Delete();
                    Console.WriteLine("削除されました: " + file.FullName);
                }
            }

            Console.WriteLine("直近に作成されたファイル以外が削除されました。");
        }
        catch (Exception ex)
        {
            Console.WriteLine("エラーが発生しました: " + ex.Message);
        }
    }
}

このサンプルコードでは、DeleteOldFilesExceptRecentメソッドで指定したフォルダ内で直近に作成されたファイル以外を削除し、0件の場合や同時刻のファイルがある場合は最後のファイルのみを残す処理を行っています。必要に応じてエラー処理なども追加してください。

Bard の回答(ファイルリストの操作)

はい、もちろんです。フォルダを指定して直近に作成されたファイル以外を削除し、残ったファイルのみを操作する方法は次のとおりです。

using System.IO;

public class Program
{
public static void Main(string[] args)
{
// フォルダのパスを指定します。
string folderPath = "C:\Users\ユーザー名\Documents\フォルダ名";

    // フォルダ内のファイルの一覧を取得します。
    IEnumerable<FileInfo> files = Directory.GetFiles(folderPath);

    // 直近に作成されたファイルのみを取得します。
    IEnumerable<FileInfo> recentFiles = files.OrderByDescending(file => file.LastWriteTime);

    // ファイルが存在する場合は、直近に作成されたファイル以外を削除します。
    if (recentFiles.Any())
    {
        foreach (FileInfo file in files)
        {
            if (!recentFiles.Contains(file))
            {
                File.Delete(file.FullName);
            }
        }
    }

    // 同時刻のファイルが存在する場合は、ファイル名の昇順で最後のファイルのみを残します。
    if (recentFiles.Any() && recentFiles.Count() > 1)
    {
        FileInfo lastFile = recentFiles.Last();
        foreach (FileInfo file in recentFiles.Skip(1))
        {
            if (file.Name < lastFile.Name)
            {
                File.Delete(file.FullName);
            }
        }
    }
}
}

このコードを実行すると、フォルダ内のファイルが直近に作成されたファイルのみになります。同時刻のファイルが存在する場合は、ファイル名の昇順で最後のファイルのみが残ります。

ファイルリスト操作のまとめ

シンプルで良いかなと思ったのは「Bing AI」ですが、クラス、メソッドまで作ってくれていないので少し不親切かな?まあ問題は全くありませんが。。

「ChatGPT」は少し処理は長いかなとは思いますが、メッセージ関連の命令を削ればすっきりして使いやすそうで、私好みです。

「Bard」は全般的に今一つ解読するのが面倒でしたが、私の感性が古いだけかもしれないです。

最後に、このサイトを見ている方には、何を今更と思われるかもしれませんが、ファイル操作は「FileInfo」オブジェクトがキーとなっていることを学習できたのが、私にとっての一番の収穫でした😊

広告
【C#】
広告
タイトルとURLをコピーしました