2012-09-10 151 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