The f_open function creates a file object to be used to access the file.
FRESULT f_open ( FIL* FileObject, /* Pointer to the blank file object structure */ const char* FileName, /* Pointer to the file neme */ BYTE ModeFlags /* Mode flags */ );
| Value | Description | 
|---|---|
| FA_READ | Specifies read access to the object. Data can be read from the file. Combine with FA_WRITE for read-write access. | 
| FA_WRITE | Specifies write access to the object. Data can be written to the file. Combine with FA_READ for read-write access. | 
| FA_OPEN_EXISTING | Opens the file. The function fails if the file is not existing. (Default) | 
| FA_OPEN_ALWAYS | Opens the file, if it is existing. If not, the function creates the new file. | 
| FA_CREATE_NEW | Creates a new file. The function fails if the file is already existing. | 
| FA_CREATE_ALWAYS | Creates a new file. If the file is existing, it is truncated and overwritten. | 
The created file object is used for subsequent calls to refer to the file. When close an open file object, use f_close function. If modified file is not closed correctly, the file may be collapsed.
Before using any file function, a work area (file system object) must be given to the logical drive with f_mount function. All file functions can work after this procedure.
The mode flags, FA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS, are not supported in read-only configuration.
void main ()
{
    FATFS fs;            // Work area (file system object) for logical drive
    FIL fsrc, fdst;      // file objects
    BYTE buffer[4096];   // file copy buffer
    FRESULT res;         // FatFs function common result code
    UINT br, bw;         // File R/W count
    // Register a work area for logical drive 0
    f_mount(0, &fs);
    // Open source file
    res = f_open(&fsrc, "srcfile.dat", FA_OPEN_EXISTING | FA_READ);
    if (res) die(res);
    // Create destination file
    res = f_open(&fdst, "dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE);
    if (res) die(res);
    // Copy source to destination
    for (;;) {
        res = f_read(&fsrc, buffer, sizeof(buffer), &br);
        if (res || br == 0) break;   // error or eof
        res = f_write(&fdst, buffer, br, &bw);
        if (res || bw < br) break;   // error or disk full
    }
    // Close all files
    f_close(&fsrc);
    f_close(&fdst);
    // Unregister a work area before discard it
    f_mount(0, NULL);
}