Bool CFileNameTo(U8 *dst, U8 *src)
{
    MemSet(dst, 0, CDIR_FILENAME_LEN);
    if (!FileNameCheck(src))
        return FALSE;
    StrCopy(dst, src);

    return TRUE;
}

I64 Name2DirClus(CDrive *drive, U8 *dirname)
{
    Bool         cont = TRUE, unlock;
    I64          cur_dir_clus;
    CDirEntry    de;
    U8          *buf = StrNew(dirname), *buf2 = StrNew(dirname);

    DriveCheck(drive);
    try
    {
        unlock = DriveLock(drive);
        cur_dir_clus = drive->root_clus;
        while (*buf && cont)
        {
            StrFirstRemove(buf, "/", buf2);
            if (*buf2)
            {
                switch (drive->fs_type)
                {
                    case FSt_REDSEA:
                        cont = RedSeaFileFind(drive, cur_dir_clus, buf2, &de, FUF_JUST_DIRS);
                        break;

                    case FSt_FAT32:
                        cont = FAT32FileFind(drive, cur_dir_clus, buf2, &de, FUF_JUST_DIRS);
                        break;

                    default:
                        throw('Drive');
                }
                cur_dir_clus = de.clus;
            }
        }
        if (!cont)
        {
            PrintErr("File not found: \"%s\".\n", dirname);
            cur_dir_clus = 0;
        }
        if (unlock)
            DriveUnlock(drive);
    }
    catch
        if (unlock)
            DriveUnlock(drive);
    Free(buf);
    Free(buf2);

    return cur_dir_clus;
}

I64 Name2ParentDirClus(CDrive *drive, U8 *dirname)
{
    Bool         cont = TRUE, unlock;
    I64          cur_dir_clus, cur_dir_clus2;
    CDirEntry    de;
    U8          *buf = StrNew(dirname), *buf2 = StrNew(dirname);

    DriveCheck(drive);
    try
    {
        unlock = DriveLock(drive);
        cur_dir_clus = cur_dir_clus2 = drive->root_clus;
        while (*buf && cont)
        {
            cur_dir_clus2 = cur_dir_clus;
            StrFirstRemove(buf, "/", buf2);
            if (*buf2)
            {
                switch (drive->fs_type)
                {
                    case FSt_REDSEA:
                        cont = RedSeaFileFind(drive, cur_dir_clus, buf2, &de, FUF_JUST_DIRS);
                        break;

                    case FSt_FAT32:
                        cont = FAT32FileFind(drive, cur_dir_clus, buf2, &de, FUF_JUST_DIRS);
                        break;

                    default:
                        throw('Drive');
                }
                cur_dir_clus = de.clus;
            }
        }
        if (!cont)
        {
            PrintErr("File not found: \"%s\".\n", dirname);
            cur_dir_clus2=0;
        }
        if (unlock)
            DriveUnlock(drive);
    }
    catch
        if (unlock)
            DriveUnlock(drive);
    Free(buf);
    Free(buf2);

    return cur_dir_clus2;
}