Add file copy/move

This commit is contained in:
SuchMemeManySkill
2020-12-26 01:05:33 +01:00
parent a74a8814e1
commit ab5c5e799e
12 changed files with 138 additions and 43 deletions

View File

@@ -0,0 +1,78 @@
#include "fscopy.h"
#include <libs/fatfs/ff.h>
#include <utils/btn.h>
#include "../tegraexplorer/tconf.h"
#include "../gfx/gfx.h"
#include <mem/heap.h>
#include <string.h>
#include "../gfx/gfxutils.h"
ErrCode_t FileCopy(const char *locin, const char *locout, u8 options){
FIL in, out;
FILINFO in_info;
u64 sizeRemaining, toCopy;
u8 *buff;
u32 x, y;
int res = 0;
gfx_con_getpos(&x, &y);
if (!strcmp(locin, locout)){
return newErrCode(TE_ERR_SAME_LOC);
}
if ((res = f_open(&in, locin, FA_READ | FA_OPEN_EXISTING))){
return newErrCode(res);
}
if ((res = f_stat(locin, &in_info))){
return newErrCode(res);
}
if ((res = f_open(&out, locout, FA_CREATE_ALWAYS | FA_WRITE))){
return newErrCode(res);
}
if (options & COPY_MODE_PRINT){
gfx_printf("[ ]");
x += 16;
gfx_con_setpos(x, y);
}
buff = malloc(TConf.FSBuffSize);
sizeRemaining = f_size(&in);
const u64 totalsize = sizeRemaining;
while (sizeRemaining > 0){
toCopy = MIN(sizeRemaining, TConf.FSBuffSize);
if ((res = f_read(&in, buff, toCopy, NULL))){
return newErrCode(res);
}
if ((res = f_write(&out, buff, toCopy, NULL))){
return newErrCode(res);
}
sizeRemaining -= toCopy;
if (options & COPY_MODE_PRINT){
gfx_printf("%3d%%", (u32)(((totalsize - sizeRemaining) * 100) / totalsize));
gfx_con_setpos(x, y);
}
if (options & COPY_MODE_CANCEL && btn_read() & (BTN_VOL_DOWN | BTN_VOL_UP)){
f_unlink(locout);
break;
}
}
f_close(&in);
f_close(&out);
free(buff);
f_chmod(locout, in_info.fattrib, 0x3A);
//f_stat(locin, &in_info); //somehow stops fatfs from being weird
return newErrCode(0);
}

View File

@@ -0,0 +1,8 @@
#pragma once
#include <utils/types.h>
#include "../err.h"
#define COPY_MODE_CANCEL BIT(0)
#define COPY_MODE_PRINT BIT(1)
ErrCode_t FileCopy(const char *locin, const char *locout, u8 options);

View File

@@ -17,7 +17,7 @@ char *CombinePaths(const char *current, const char *add){
return ret;
}
char *EscapeFolder(char *current){
char *EscapeFolder(const char *current){
char *ret;
char *temp;

View File

@@ -3,6 +3,6 @@
#include "fstypes.h"
u64 GetFileSize(char *path);
char *EscapeFolder(char *current);
char *EscapeFolder(const char *current);
char *CombinePaths(const char *current, const char *add);
char *GetFileAttribs(FSEntry_t entry);

View File

@@ -10,6 +10,10 @@
#include <string.h>
#include <mem/heap.h>
#include "../../tegraexplorer/tconf.h"
#include "../../err.h"
#include "../fscopy.h"
#include <libs/fatfs/ff.h>
#include "../../hid/hid.h"
MenuEntry_t topEntries[] = {
{.optionUnion = COLORTORGB(COLOR_GREEN) | SKIPBIT},
@@ -39,7 +43,7 @@ void FileExplorer(char *path){
int res = 0;
while (1){
topEntries[2].optionUnion = COLORTORGB(((TConf.explorerCopyMode != CMODE_None) ? COLOR_ORANGE : COLOR_GREY)) | SKIPBIT;
topEntries[2].optionUnion = (TConf.explorerCopyMode != CMODE_None) ? (COLORTORGB(COLOR_ORANGE)) : (COLORTORGB(COLOR_GREY) | SKIPBIT);
gfx_clearscreen();
gfx_printf("Loading...\r");
@@ -67,7 +71,32 @@ void FileExplorer(char *path){
char *oldPath = storedPath;
if (res < ARR_LEN(topEntries)) {
if (res == 2){
ErrCode_t res;
char *filename = CpyStr(strrchr(TConf.srcCopy, '/') + 1);
char *dst = CombinePaths(storedPath, filename);
if (!strcmp(TConf.srcCopy, dst))
res = newErrCode(TE_ERR_SAME_LOC);
else {
if (TConf.explorerCopyMode == CMODE_Move){
if ((res.err = f_rename(TConf.srcCopy, dst)))
res = newErrCode(res.err);
}
else {
gfx_clearscreen();
RESETCOLOR;
gfx_printf("Hold vol+/- to cancel\nCopying %s... ", filename);
res = FileCopy(TConf.srcCopy, dst, COPY_MODE_CANCEL | COPY_MODE_PRINT);
}
}
DrawError(res);
free(dst);
free(filename);
ResetCopyParams();
}
else if (res < ARR_LEN(topEntries)) {
if (!strcmp(storedPath, path)){
clearFileVector(&fileVec);
return;

View File

@@ -46,7 +46,7 @@ void CopyClipboard(char *path, FSEntry_t entry){
void MoveClipboard(char *path, FSEntry_t entry){
char *thing = CombinePaths(path, entry.name);
SetCopyParams(thing, CMODE_Copy);
SetCopyParams(thing, CMODE_Move);
free(thing);
}
@@ -56,33 +56,6 @@ MenuEntry_t DeleteEntries[] = {
};
void DeleteFile(char *path, FSEntry_t entry){
/*
u8 left = 0;
while (1){
gfx_con_setpos(384 + 16, 200 + 16 + 9 * 16);
SETCOLOR(COLOR_RED, COLOR_DARKGREY);
gfx_printf("Are you sure? ");
(left) ? SETCOLOR(COLOR_DARKGREY, COLOR_RED) : SETCOLOR(COLOR_RED, COLOR_DARKGREY);
gfx_printf("Yes");
RESETCOLOR;
gfx_printf(" ");
(!left) ? SETCOLOR(COLOR_DARKGREY, COLOR_YELLOW) : SETCOLOR(COLOR_YELLOW, COLOR_DARKGREY);
gfx_printf("No");
Input_t *input = hidWait();
if (input->a && left)
break;
else if (input->right)
left = 0;
else if (input->left)
left = 1;
else if (input->a || input->b)
return;
}
*/
gfx_con_setpos(384 + 16, 200 + 16 + 8 * 16);
SETCOLOR(COLOR_RED, COLOR_DARKGREY);
gfx_printf("Are you sure? ");