C # chỉ nhận được X số tệp

Sep 01 2020

Tôi chỉ muốn xử lý X số lượng tệp tại một thời điểm cho vòng lặp vô hạn bên dưới. Các mã dưới đây cung cấp cho tôi tất cả các tệp cùng một lúc, làm thế nào để chỉ nhận được số tệp X?

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);
}

Trả lời

9 PrasadTelkikar Sep 01 2020 at 06:20

Bạn có thể sử dụng kết hợp để xử lý các tệp của bạn theo lôSkip() .Take(X)

Skip (): Bỏ qua một số phần tử được chỉ định trong một chuỗi và sau đó trả về các phần tử còn lại.


Take (): Trả về một số phần tử liền kề được chỉ định từ đầu một chuỗi.

Xử lý tệp theo lô,

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();
        }

        
    }

Phương thức thread.sleep không ở đúng nơi

bạn luôn có thể sử dụng Await Task.Delay () tốt hơn nhiều so với thread.sleep vì nó làm cho toàn bộ chương trình bị đóng băng tùy thuộc vào những gì bạn đang làm với nó

JohnWu Sep 01 2020 at 06:25

Chỉ cần giữ một quầy. Mỗi lần bạn xử lý một tệp, hãy tăng nó lên một tệp. Khi nó đạt đến giới hạn, bạn đã kết thúc lô.

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);
}