C # hanya mendapatkan X file

Sep 01 2020

Saya ingin memproses hanya sejumlah X file sekaligus untuk loop tak terbatas di bawah ini. Kode di bawah ini memberi saya semua file sekaligus, bagaimana cara mendapatkan hanya sejumlah X file?

while (true)
{
    var files = new DirectoryInfo(@"path")
                .GetFiles()
                .OrderBy(p => p.LastWriteTimeUtc)
                .ToList();

    foreach (var f in files)
    {
        //do some processing
        Console.WriteLine(f.Name);

        f.Delete();
    }

    Thread.Sleep(5000);
}

Jawaban

9 PrasadTelkikar Sep 01 2020 at 06:20

Anda dapat menggunakan kombinasi yang akan memproses file Anda secara berkelompokSkip() .Take(X)

Lewati (): Melewati sejumlah elemen tertentu secara berurutan dan kemudian mengembalikan elemen yang tersisa.


Take (): Mengembalikan sejumlah tertentu elemen yang berdekatan dari awal urutan.

Proses file dalam batch,

var batchSize = 10;   //Decide batch size I considered 10 files in a batch
var skipBatch = 0     //Skip count
while (true)
{
    var files = new DirectoryInfo(@"path").GetFiles()
       .OrderBy(p => p.LastWriteTimeUtc).ToList(); //store all files

    var skipIntervals = skipBatch * batchSize;
    //Exit condition from infinity loop
    if(skipIntervals > files.Length)
        break;

    var filesInBatch = files.Skip(skipIntervals).Take(batchSize);
    foreach (var f in filesInBatch)
    {
        //do some processing
        Console.WriteLine(f.Name);
        f.Delete();
    }
    Thread.Sleep(5000);
    skipBatch++;  //Increment skipBatch count by 1 as this batch is processed
}
1 CaptainW Sep 01 2020 at 06:24
 while (true)
    {
        var files = new DirectoryInfo(@"path").GetFiles()
            .OrderBy(p => p.LastWriteTimeUtc).ToList();

        foreach (var f in files)
        {
           Thread.Sleep(5000);//should be up here
            //do some processing
            Console.WriteLine(f.Name);

            f.Delete();
        }

        
    }

Metode thread.sleep tidak berada di tempat yang tepat

Anda selalu dapat menggunakan Await Task.Delay () jauh lebih baik daripada thread.sleep karena membuat seluruh program membeku tergantung pada apa yang Anda lakukan dengannya

JohnWu Sep 01 2020 at 06:25

Simpan saja penghitung. Setiap kali Anda memproses file, tingkatkan satu per satu. Saat mencapai batasnya, Anda telah mengakhiri kelompoknya.

while (true)
{
    var counter = 0;
    var files = new DirectoryInfo(@"path").GetFiles()
        .OrderBy(p => p.LastWriteTimeUtc).ToList();
    foreach (var f in files)
    {
        //do some processing
        Console.WriteLine(f.Name);
        f.Delete();
        counter++;
        if (counter >= batchSize) 
        {
            Thread.Sleep(timeBetweenBatches);
            counter = 0;
        }
    }
    Thread.Sleep(5000);
}