2009-04-13 12 views
11

He visto algunos ejemplos pero ninguno hasta el momento en C#, ¿cuál es la mejor manera de seleccionar un archivo aleatorio en un directorio?seleccionar el archivo aleatorio del directorio

En este caso particular, quiero seleccionar un fondo de pantalla de "C: \ wallpapers" cada 15 minutos aproximadamente.

Gracias.

Respuesta

4

select random file from directory

private string getrandomfile2(string path) 
    { 
     string file = null; 
     if (!string.IsNullOrEmpty(path)) 
     { 
      var extensions = new string[] { ".png", ".jpg", ".gif" }; 
      try 
      { 
       var di = new DirectoryInfo(path); 
       var rgFiles = di.GetFiles("*.*").Where(f => extensions.Contains(f.Extension.ToLower())); 
       Random R = new Random(); 
       file = rgFiles.ElementAt(R.Next(0,rgFiles.Count())).FullName; 
      } 
      // probably should only catch specific exceptions 
      // throwable by the above methods. 
      catch {} 
     } 
     return file; 
    } 
+0

Capturar excepciones e ignorarlas silenciosamente es malo. Debería manejar la excepción y devolver algo útil, o no capturarlos en absoluto. – Guffa

24

Obtener todos los archivos en una matriz y luego recuperar uno al azar

var rand = new Random(); 
var files = Directory.GetFiles("c:\\wallpapers","*.jpg"); 
return files[rand.Next(files.Length)]; 
+0

yo probamos este fragmento de código y su funcionamiento muy bien pero que sólo se busca en los fondos de pantalla de la carpeta y no buscar en sus subcarpetas dentro de los papeles pintados. ¿Cómo modificar el código para hacer eso también? – ankitG

+1

Considere pasar SearchOption.AllDirectories como tercer argumento al método GetFiles. – Mouk

0

¿por qué no:

  1. obtener los archivos en una matriz
  2. utilizar la clase aleatorio para seleccionar un número que es aleatorio entre 0 y archivos.Longitud
  3. Tome el archivo de la matriz usando el número aleatorio como el índice
3
var files = new DirectoryInfo(@"C:\dev").GetFiles(); 
int index = new Random().Next(0, files.Length); 

Console.WriteLine(files[index].Name); 
0

Utilice la Directory.GetFiles(...) para obtener el conjunto de nombres de archivos y el uso de la clase Random para seleccionar un archivo aleatorio.

9

Si está haciendo esto para fondos de pantalla, no desea simplemente seleccionar un archivo al azar porque no aparecerá aleatoriamente para el usuario.

¿Qué pasa si eliges la misma tres veces seguidas? ¿O alternar entre dos?

Eso es "aleatorio", pero a los usuarios no les gusta.

Consulta esta publicación sobre cómo display random pictures in a way users will like.

+0

Cuando baraje, probablemente también deba dar cuenta del caso en que un archivo se borre o se agregue al directorio (en cuyo caso deberá volver a mezclar). – Joey

+0

Gran punto, gracias por agregar eso. –

Cuestiones relacionadas