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;
}