0

いくつかのファイルを含むフォルダーがあり、ランダムな秒ごとにそれらをすべてコピーしたいとしましょう (1 秒から 1 時間の間でランダムとしましょう -> これは可能ですか?) ランダムな順序で。File.Copy("from", "to");ファイルをコピーできることは知っています。しかし、私はこのランダムなものが必要です。何か案は?

4

6 に答える 6

4

ファイルをリストに読み込み、これを使用してシャッフルします

List<T> をランダム化する

次に、コピーループで、1000から3600000までのランダムなミリ秒だけスリープします

    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo("dirctory path");

    List<System.IO.FileInfo> files = di.GetFiles().ToList();

    di = null;  // at this point I don't think you need to hold on to di

    // the static Directory will return string file names

    // randomize files using the code in the link 
    Random random = new Random();
    foreach (System.IO.FileInfo fi in files)
    {
        Thread.Sleep(random.Next(1000, 3600000));
        // should probaly test the fi is still valid
        fi.CopyTo("desitination");
    }
于 2012-09-10T22:11:32.977 に答える
1

これはうまくいくはずです:

Random random = new Random();

int seconds = random.Next(3600) + 1;
List<FileInfo> files = new DirectoryInfo(Environment.CurrentDirectory).GetFiles().ToList();

Timer timer = new Timer() { Interval = seconds * 1000, AutoReset = true };
timer.Elapsed += (s, e) =>
    {
        files = files.OrderBy(f => random.NextDouble()).ToList();
        foreach(FileInfo file in files)
        {
            try { file.CopyTo("SomeDestination"); }
            catch { Console.WriteLine("Error copying file " + file); }
        }
    };
timer.Start();
于 2012-09-10T22:16:59.047 に答える
1

これを試して

        Timer t = new Timer();
        t.Interval = 1;
        t.Enabled = true;
        t.Tick += (s, o) =>
            {
                // interval between 1000ms(1s) & 1H
                t.Interval =1000*( new Random().Next(3600));
                string[] still_files ;
                do
                {
                    still_files = Directory.GetFiles(@"c:\source").Select(X => Path.GetFileName(X))
                    .Except(Directory.GetFiles(@"c:\destination").Select(X => Path.GetFileName(X)))
                    .ToArray();

                File.Copy(Path.Combine(@"c:\source", still_files[new Random().Next(still_files.Count()) - 1]), @"c:\destination");
                } while (still_files.Count> 0);
            };
于 2012-09-10T22:19:37.563 に答える
1

可能です。最も単純な実装は次のようになります。

    static void Main(string[] args)
    {
        var files = Directory.GetFiles(@"c:\temp");
        var dest = @"c:\temp2";
        var rnd = new Random();
        int maxDelay = 60; // one minute

        var schedule = files.Select(f => new {FilePath = f, Delay = rnd.Next(maxDelay)}).ToList();
        schedule.Sort( (a,b) => a.Delay-b.Delay );

        var startTime = DateTime.Now;

        foreach (var s in schedule)
        {
            int curDelay = (int) (DateTime.Now - startTime).TotalSeconds;

            if (s.Delay <= curDelay) File.Copy(s.FilePath, Path.Combine(dest, Path.GetFileName(s.FilePath)));
            else {
                Thread.Sleep((s.Delay-curDelay)*1000);
                File.Copy(s.FilePath, Path.Combine(dest, Path.GetFileName(s.FilePath)));
            }
        }
    }

それでは、ファイルのリストを作成しましょう。次に、ランダムな遅延を割り当てます。次に、遅延値で並べ替えます。次に、時間が来た場合はファイルをコピーするか、次のコピー時間までスリープするリストを調べます。

ループが完了した後、すべてのファイルがそれぞれ遅延時間ごとにコピーされます。

于 2012-09-10T22:30:06.100 に答える
0

すべてのファイル名を配列に取得し、配列からランダムな文字列を選択し、これを使用してファイルを取得します。

ランダムな整数でタイマーを使用します。乱数の使い方がわからない場合は、単に を使用するRandom rand = new Random()rand.Next(10)、0 から 9 までのランダムな整数が返されます。

于 2012-09-10T22:08:25.423 に答える
0

System.Randomクラスを調べます。これを使用して、1 から 3600 までの整数を生成できます。3600 は 1 時間の秒数です。

ファイル名をランダム化するには、ファイル名を配列に入れてから、以前に作成した のインスタンスのr.Next()場所で配列を並べ替えます。rSystem.Random

于 2012-09-10T22:10:41.703 に答える