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