2012-09-10 117 views
0

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

+0

你的意思是,你也是以随机顺序复制文件的一部分,或者你应该随机复制整个文件? – Patrick

+0

我知道我们并不是想回答问题,但可以分享为什么要这样吗? – Paparazzi

+0

@Patrick每x秒复制文件夹中的所有文件。假设文件夹中有文件A,B,C,D,因此将它们全部在第二个x BUT中随机拷贝,所以并不总是A然后B然后C然后D它应该是随机的。 – silla

回答

3

阅读文件到列表,并在副本中循环使用该

Randomize a 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"); 
    } 
+1

中的所有文件,而不是将文件本身读入FileStream并挂在它们上面,我会使用Directory.GetFiles()来检索代表文件元数据的FileInfo对象并存储它们。通过这种方式,不必保留实际文件的句柄,这可以在其他地方完成工作。 – KeithS

+0

我同意。这就是我的意思,但不是我的话所说的。 GetFiles()返回名称加上路径无FileInfo。但同意你的观点。 – Paparazzi

+0

@KiethS我认为需要使用DirectoryInfo来获取FileInfo。我现在正在测试它。 – Paparazzi

0

获取所有文件名到数组中,从数组中选取一个随机字符串,使用它获取文件。

使用具有随机整数的计时器。如果你不知道如何使用随机数,那么它只是​​与rand.Next(10),这将返回0和9之间的随机整数。

0

查找System.Random类。您可以使用它来生成1到3600之间的整数,3600是一小时内的秒数。

要随机化文件名,请将它们放在数组中,然后按r.Next()对数组进行排序,其中r是您之前创建的System.Random的实例。

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

这并不涉及复制随机文件。 – itsme86

+0

他想复制它们** **所有,但在随机的时间间隔,再次读取的问题,是这样吗@silla – S3ddi9

+0

也许你应该重新读取问题。他想要复制所有文件,但是是以随机顺序。 – itsme86

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

这样 - 让我们创建的文件列表。然后分配随机延迟。然后按延迟值对它们进行排序。然后通过复制文件的列表,如果时间到了或睡觉,直到下一次复制时间。

循环完成后,所有文件都在大约延迟时间被复制。

+0

curDelay是累积的不在之间。如果一个文件不符合延迟,那么它根本就不会被复制。它小睡一秒钟,然后进入下一个。 – Paparazzi

+0

而如果延迟满足再有就是对下一个文件 – Paparazzi

+0

curDelay零延迟不会“累积”,这是绝对的。因为文件延迟。没有零延迟。它将所有内容复制的延迟已经来了,然后根据需要为下一份复印件会睡之多。好吧,现在有一个流程 - 它应该重新尝试文件复制。更新。 – aiodintsov