void HashedFiles::SortAndCheck(int SortMode)
{
    // Shell Sort
    BOOL swap;
    tagFileNode* TempNode;
    int i, j, diff = 0;
    for (j = _NodeCount / 2; j > 0; j /= 2)
    {
        swap = true;
        while (swap)
        {
            swap = false;
            for (i = 0; i + j < _NodeCount; ++i)
            {
                switch (SortMode)
                {
                case 0: // By FileHash, then by FileName
                    diff =                HashCompare(_NodeList[i]->FileHash->c_str(), _NodeList[i + j]->FileHash->c_str());
                    if (diff == 0) diff = FileCompare(_NodeList[i]->FileName->c_str(), _NodeList[i + j]->FileName->c_str());
                    break;
                case 1: // By FileName alone
                    diff =                FileCompare(_NodeList[i]->FileName->c_str(), _NodeList[i + j]->FileName->c_str());
                    break;
                case 2: // By FileDate, then by FileTime, then by FileName
                    diff =                DateCompare(_NodeList[i]->FileDate->c_str(), _NodeList[i + j]->FileDate->c_str());
                    if (diff == 0) diff = TimeCompare(_NodeList[i]->FileTime->c_str(), _NodeList[i + j]->FileTime->c_str());
                    if (diff == 0) diff = FileCompare(_NodeList[i]->FileName->c_str(), _NodeList[i + j]->FileName->c_str());
                    break;
                case 3: // By FileSize, then by FileName
                    diff =                SizeCompare(_NodeList[i]->FileSize->c_str(), _NodeList[i + j]->FileSize->c_str());
                    if (diff == 0) diff = FileCompare(_NodeList[i]->FileName->c_str(), _NodeList[i + j]->FileName->c_str());
                    break;
                }
                if (diff > 0)
                {
                    swap = true;
                    TempNode = _NodeList[i];
                    _NodeList[i] = _NodeList[i + j];
                    _NodeList[i + j] = TempNode;
                }
            }
        }
    }
    // Scan for duplicate hashes and mark them.
    if (SortMode == 0)
    {
        for (i = 1; i < _NodeCount; ++i)
        {
            if (_NodeList[i]->FileHash->compare(_NodeList[i - 1]->FileHash->c_str()) == 0)
                _NodeList[i]->Duplicate = true; else _NodeList[i]->Duplicate = false;
        }
    }
}