2012-06-29 4 views
0

Так что я не могу найти хороший пример этого в любом месте. Я нашел хороший пример из this вопроса о выборе случайного файла из каталога, но мне нужно выбрать случайный файл из дерева каталогов (неизвестной глубины). Этот код получает случайный файл из 1 каталога, но я был озадачен тем, как его распространить на все подкаталоги, я уверен, что один из вас, гуру LINQ, может помочь мне что-то сделать.Получение случайного файла из дерева каталогов

var extensions = new string[] { ".mp3" }; 
var di = new DirectoryInfo(MusicPath); 
var rgFiles = di.GetFiles("*.*") 
    .Where(f => extensions.Contains(f.Extension.ToLower())); 
int fileCount = rgFiles.Count(); 
if (fileCount > 0) 
{ 
    int x = this.Generator.Next(0, fileCount); //Generator is 'Random' object 
    file = rgFiles.ElementAt(x).FullName; 
} 

ответ

4

Попробуйте

var random = new Random(); // this should be placed in a static member variable, but is ok for this example 
var fileNames = System.IO.Directory.GetFiles(@"c:\temp", "*.mp3", SearchOption.AllDirectories); 
var randomFile = fileNames[random.Next(0, fileNames.Length)]; 
+0

Человек, который был до смешного легко, радуясь спросил я был в середине крафта рекурсивного беспорядок. Благодаря! –

+0

Рад помочь. Я всегда пытаюсь решить, используя Directory/File, а не DirectoryInfo/FileInfo. – Kane

+0

+1, и это также самое быстрое. Я попробовал Directory.EnumerateFiles (путь, шаблон, SearchOption.AllDirectories) .Skip (random.Next (0, fileCount) .First(), но, по-видимому, единственный способ найти .NET fileCount - подсчитать результат GetFiles :) – Martheen

Смежные вопросы