假设我有一个包含一些文件的文件夹,我想以随机顺序在每个随机秒内复制它们(假设在 1 秒到 1 小时之间随机 -> 这可能吗?)。我知道File.Copy("from", "to");
你可以复制文件。但我需要这些随机的东西。有任何想法吗?
问问题
619 次
6 回答
4
将文件读入列表并使用此随机播放
然后在复制循环中,只需从 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 回答