0

假设我有一个包含一些文件的文件夹,我想以随机顺序在每个随机秒内复制它们(假设在 1 秒到 1 小时之间随机 -> 这可能吗?)。我知道File.Copy("from", "to");你可以复制文件。但我需要这些随机的东西。有任何想法吗?

4

6 回答 6

4

将文件读入列表并使用此随机播放

随机化一个列表<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 是一小时内的秒数。

要随机化文件名,请将它们放入一个数组中,然后按照r.Next()r之前创建的System.Random.

于 2012-09-10T22:10:41.703 回答