Bool CopySingleZ(U8 *f1, U8 *f2) //Just one file
{
    U8          *file_buf=NULL;
    I64          size, attr=0, c;
    CDirEntry    de;

    if (FileFind(f1, &de, FUF_JUST_FILES))
    {
        Free(de.full_name);
        file_buf = FileRead(f1, &size, &attr);
        attr = FileAttr(f2, attr);
        if (file_buf)
        {
            "Copying %s to %s\n", f1, f2;
            c = FileWrite(f2, file_buf, size, de.datetime, attr);
            Free(file_buf);
            return ToBool(c);
        }
        else
            PrintErr("File not found: \"%s\".\n", f1);
    }
    else
        PrintErr("File not found: \"%s\".\n", f1);

    return FALSE;
}

#define COPY_BUF_BLKS   0x80
Bool CopySingle(U8 *f1, U8 *f2) //Just one file
{
    U8      *absf1 = FileNameAbs(f1), *absf2 = FileNameAbs(f2), *buf;
    I64      count, n, size, attr1 = FileAttr(f1), attr2 = FileAttr(f2), i, j, time = counts.jiffies;
    CFile   *in_file = NULL, *out_file = NULL;

    if (!StrCompare(absf1, absf2))
    {//onto self?
        Free(absf1);
        Free(absf2);
        return FALSE;
    }
    Free(absf1);
    Free(absf2);
    if (attr1 != attr2)
        return CopySingleZ(f1, f2);
    buf = MAlloc(COPY_BUF_BLKS << BLK_SIZE_BITS);
    if (attr1 & RS_ATTR_CONTIGUOUS)
        in_file = FOpen(f1, "rc");
    else
        in_file = FOpen(f1, "r");
    if (in_file)
    {
        size = FSize(in_file);
        count = (size + BLK_SIZE - 1) >> BLK_SIZE_BITS;
        if (attr2 & RS_ATTR_CONTIGUOUS)
            out_file = FOpen(f2, "wc", count);
        else
            out_file = FOpen(f2, "w", count);
        if (out_file)
        {
            "Copying %s to %s", f1, f2;
            j = size;
            while (count > 0)
            {
                if (count > COPY_BUF_BLKS)
                {
                    n = COPY_BUF_BLKS;
                    i = n << BLK_SIZE_BITS;
                    if (counts.jiffies > time + 2000)
                    {
                        "\n [ %0.2f%% ]", 100 * ToF64(size - j) / size;
                        time = counts.jiffies;
                    }
                }
                else
                {
                    n = count;
                    i = j;
                }
                FBlkRead(in_file,   buf, FFB_NEXT_BLK, n);
                FBlkWrite(out_file, buf, FFB_NEXT_BLK, n);
                count -= n;
                j -= n << BLK_SIZE_BITS;
            }
            "\n";
            out_file->flags         |= FF_USE_OLD_DATETIME;
            out_file->de.datetime   = in_file->de.datetime;
            out_file->de.size       = size;
            out_file->de.attr       = FileAttr(f2, in_file->de.attr);
            FClose(out_file);
            FClose(in_file);
            Free(buf);
            return TRUE;
        }
        else
            PrintErr("File not found: \"%s\".\n", f2);
        FClose(in_file);
    }
    else
        PrintErr("File not found: \"%s\".\n", f1);
    Free(buf);

    return FALSE;
}

I64 Del(U8 *files_find_mask, Bool make_mask=FALSE, Bool del_dir=FALSE, Bool print_message=TRUE)
{//Delete files.
    I64          res = 0;
    CDirContext *dirc;

    if (dirc = DirContextNew(files_find_mask, make_mask))
    {
        switch (dirc->drive->fs_type)
        {
            case FSt_REDSEA:
                res = RedSeaFilesDel(dirc->drive, Fs->cur_dir, dirc->mask, 0, del_dir, print_message);
                break;

            case FSt_FAT32:
                res = FAT32FilesDel(dirc->drive, Fs->cur_dir, dirc->mask, 0, del_dir, print_message);
                break;

            case FSt_ISO9660:
                PrintErr("File System Not Writable\n");
                break;

            default:
                PrintErr("File System Not Supported\n");
        }
        DirContextDel(dirc);
    }

    return res;
}