From a89f46b78117aef122b424a750b97a8dada65346 Mon Sep 17 00:00:00 2001 From: d0k3 Date: Tue, 15 Mar 2016 22:17:59 +0100 Subject: [PATCH] Also check free space when copying files --- source/fs.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/source/fs.c b/source/fs.c index 9d092aa..5d67828 100644 --- a/source/fs.c +++ b/source/fs.c @@ -204,30 +204,33 @@ bool PathCopyWorker(char* dest, char* orig, bool overwrite) { if (f_open(&ofile, orig, FA_READ | FA_OPEN_EXISTING) != FR_OK) return false; + fsize = f_size(&ofile); + if (GetFreeSpace(dest) < fsize) { + ShowPrompt(false, "Error: File is too big for destination"); + f_close(&ofile); + return false; + } + if (f_open(&dfile, dest, FA_WRITE | FA_CREATE_ALWAYS) != FR_OK) { f_close(&ofile); return false; } - fsize = f_size(&ofile); + f_lseek(&dfile, 0); f_sync(&dfile); f_lseek(&ofile, 0); f_sync(&ofile); ret = true; - for (size_t pos = 0; pos < fsize; pos += main_buffer_size) { + for (size_t pos = 0; (pos < fsize) && ret; pos += main_buffer_size) { UINT bytes_read = 0; UINT bytes_written = 0; f_read(&ofile, main_buffer, main_buffer_size, &bytes_read); - if (!ShowProgress(pos + (bytes_read / 2), fsize, orig)) { + if (!ShowProgress(pos + (bytes_read / 2), fsize, orig)) ret = false; - break; - } f_write(&dfile, main_buffer, bytes_read, &bytes_written); - if (bytes_read != bytes_written) { + if (bytes_read != bytes_written) ret = false; - break; - } } ShowProgress(1, 1, orig);