// Checks if two files have equal content using memory mapped files
import std.file;
import std.mmfile;
import std.stdio;

// Compares the content of two files
private bool equals(in string f1, in string f2)
{
        if (getSize(f1) != getSize(f2))
                return false;   // different file sizes

        if (getSize(f1) == 0)
                return true;    // zero-length files are equal
        
        MmFile m1, m2;
        try
        {
                m1 = new MmFile(f1);
                m2 = new MmFile(f2);
                return m1[] == m2[];
        }
        catch (Throwable ex)
        {
                writefln("File read error: %s", ex.msg);
                return false;  // cannot compare the files
        }
        finally
        {
                delete m1;
                delete m2;
        }
}

void main (string[] args)
{
        enum NotFound = "Cannot open file: %s";

        if (args.length == 3)
        {
                auto f1 = args[1], f2 = args[2];

                if (!(exists(f1) && isFile(f1)))
                        writefln(NotFound, f1);
                else if (!(exists(f2) && isFile(f2)))
                        writefln(NotFound, f2);
                else if (equals(f1, f2))
                        writeln("Same files");
                else
                        writeln("Different files");
        }
        else
        {
                writeln("Usage: filequals <file1> <file2>");
        }
}

Reply via email to