Shuffle

John Reimer terminal.node at gmail.com
Thu Jan 24 21:03:10 PST 2008


Walter Bright wrote:
> For fun, I ordered a new car stereo that would play music from an SD 
> card or USB stick(rather than from CD), and installed it over the 
> weekend. The problem is loading songs onto the SD card from my home 
> music server, which I like to hear played at random.
> 
> The solution is a simple D program, shuffle, which will randomly copy 
> music files to an SD card until it fills up. Have some fun with it!
> ----------------------------
> 
> /* Program to randomly copy music files from source to destination device.
>  * Written in the D programming language.
>  * Written by Walter Bright, http://www.digitalmars.com
>  * Placed into the Public Domain.
>  */
> 
> 
> import std.file;
> import std.stdio;
> import std.string;
> import std.c.stdlib;
> import std.path;
> import std.random;
> 
> int main(string[] args)
> {
>     if (args.length != 3)
>     {    writefln("Usage: shuffle fromdir todir");
>     exit(1);
>     }
>     auto fromdir = args[1];
>     auto todir = args[2];
> 
>     /* Recursively search for all the mp3 and wma files in directory 
> fromdir
>      * and put them into files[]
>      */
>     string[] files;
>     bool callback(DirEntry *de)
>     {
>     if (de.isdir)
>         listdir(de.name, &callback); // recurse into subdirectories
>     else
>     {
>         // Collect only files with mp3 and wma extensions
>         auto ext = getExt(de.name);
>         if (fnmatch(ext, "mp3") || fnmatch(ext, "wma"))
>         files ~= de.name;
>     }
>     return true;    // keep going
>     }
>     std.file.listdir(fromdir, &callback);
> 
>     writefln(files.length, " music files");
> 
>     /* The loop will normally quit via an exception when the target device
>      * is full. But if there are not enough files in the source to fill
>      * up the target, the loop ensures it will still eventually quit.
>      */
>     for (size_t i = 0; i < files.length; i++)
>     {
>     auto j = std.random.rand() % files.length;
>     auto fromfile = files[j];
>     auto tofile = std.path.join(todir, basename(fromfile));
>     writefln("%s => %s", fromfile, tofile);
>     std.file.copy(fromfile, tofile);
>     }
> 
>     writefln("Done");
>     return 0;
> }


And what would be the Tango equivalent, I wonder?  ;)


More information about the Digitalmars-d-announce mailing list