Скопировать файл с помощью FATFS на тот же логический диск

MCU - stm32f407vgt6
IDE - True Studio
Дополнительно - CubeMx

Описание -
Я пытаюсь скопировать файл с USB-накопителя на тот же USB-накопитель с другим именем.

Исходный файл - FILE2.txt - этот файл присутствует на приводе, его размер составляет 3KB
. Целевой файл - file2copy.txt - этот файл будет создан на том же диске, и содержимое FILE2.txt будет скопировано.

Код -

int CopyFile(char *srcFile, char *destFile)
{
    FATFS fs0;
    FIL fsrc, fdest;
    BYTE buffer[4096];
    FRESULT res;
    UINT br, bw;

    f_mount(&fs0, USBHPath, 0);

    res = f_open(&fsrc, (const TCHAR*)srcFile, FA_READ | FA_OPEN_EXISTING);
    if (res)    return 0;
    else
    {
        Green_Blink(100);
        res = f_open(&fdest, (const TCHAR*)destFile, FA_WRITE | FA_CREATE_ALWAYS);
        if (res)   return 0;
        else
        {
            Green_Blink(100);
            for (;;) {
                res = f_read(&fsrc, buffer, sizeof buffer, &br);  /* Read a chunk of source file */
                if (res || br == 0) break; /* error or eof */
                res = f_write(&fdest, buffer, br, &bw);            /* Write it to the destination file */
                if (res || bw < br) break; /* error or disk full */
                f_sync(&fdest);
            }
        }
    }
    f_close(&fsrc);
    f_close(&fdest);

    f_mount(0, USBHPath, 0);

    return 1;
}

ОШИБКА -
Я могу открыть исходный файл, но не могу создать целевой файл на диске.

res = f_open(&fdest, (const TCHAR*)destFile, FA_WRITE | FA_CREATE_ALWAYS);
if (res)   return 0;

res становится истинным в случае.

Итак, мой вопрос: как скопировать файл на тот же логический диск и в чем проблема с открытием целевого файла на этом диске.

Заранее спасибо.

Проверить значение константы _FS_LOCK.

JMA 10.09.2018 09:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
1 762
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В первую очередь, Я не знаю настроек вашего стека, но переменные FATFS fs0; и BYTE buffer[4096]; могут оказаться тяжелыми для размещения в стеке. Убедитесь, что размер стека больше 4096 + FF_MAX_SS

Во-вторых, Какую ошибку вы получили? Это перечисление должно быть полезно:

 typedef enum {
    FR_OK = 0,              /* (0) Succeeded */
    FR_DISK_ERR,            /* (1) A hard error occurred in the low level disk I/O layer */
    FR_INT_ERR,             /* (2) Assertion failed */
    FR_NOT_READY,           /* (3) The physical drive cannot work */
    FR_NO_FILE,             /* (4) Could not find the file */
    FR_NO_PATH,             /* (5) Could not find the path */
    FR_INVALID_NAME,        /* (6) The path name format is invalid */
    FR_DENIED,              /* (7) Access denied due to prohibited access or directory full */
    FR_EXIST,               /* (8) Access denied due to prohibited access */
    FR_INVALID_OBJECT,      /* (9) The file/directory object is invalid */
    FR_WRITE_PROTECTED,     /* (10) The physical drive is write protected */
    FR_INVALID_DRIVE,       /* (11) The logical drive number is invalid */
    FR_NOT_ENABLED,         /* (12) The volume has no work area */
    FR_NO_FILESYSTEM,       /* (13) There is no valid FAT volume */
    FR_MKFS_ABORTED,        /* (14) The f_mkfs() aborted due to any problem */
    FR_TIMEOUT,             /* (15) Could not get a grant to access the volume within defined period */
    FR_LOCKED,              /* (16) The operation is rejected according to the file sharing policy */
    FR_NOT_ENOUGH_CORE,     /* (17) LFN working buffer could not be allocated */
    FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */
    FR_INVALID_PARAMETER    /* (19) Given parameter is invalid */
} FRESULT;

А также, пытается не держать открытыми два файла одновременно:

int CopyFile(char *srcFile, char *destFile)
{
    FATFS fs0;
    FIL file;
    BYTE buffer[4096];
    FRESULT res;
    UINT br = 0, bw = 0;

    f_mount(&fs0, USBHPath, 0);

    res = f_open(&file, (const TCHAR*)srcFile, FA_READ | FA_OPEN_EXISTING);
    if (res){
        f_mount(0, USBHPath, 0);
        return 0;
    }

    f_read(&file, buffer, sizeof(buffer), &br);  /* Read a chunk of source file */
    f_close(&file);

    if (br) {
        Green_Blink(100);

        res = f_open(&file, (const TCHAR*)destFile, FA_WRITE | FA_CREATE_ALWAYS);
        if (res) {
            f_mount(0, USBHPath, 0);
            return 0;
        }

        Green_Blink(100);

        f_write(&file, buffer, br, &bw); /* Write it to the destination file */
        f_close(&file);

        if (!bw) {
            f_mount(0, USBHPath, 0);
            return 0;
        }

    }

    f_mount(0, USBHPath, 0);

    return 1;
}

Другие вопросы по теме