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;
        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\n", f1, f2;
                        j = size;
                        while (count > 0)
                        {
                                if (count > COPY_BUF_BLKS)
                                {
                                        n = COPY_BUF_BLKS;
                                        i = n << BLK_SIZE_BITS;
                                }
                                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;
                        }
                        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;

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

        return res;
}