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; }