Ако имате вашите файлове в съдържанието на вашия проект, трябва да използвате класът ContentManager
. Той ви дава повече от просто зареждане на файлове. Например можете да използвате Content.Unload
, за да разтоварите всички вашите данни, когато вече не ги използвате.
Няма нужда да избягвате този клас. Тази страница има пример показва точно какво се опитвате да направите:
public static Dictionary<string, T> LoadContent<T>(
this ContentManager contentManager, string contentFolder)
{
var dir = new DirectoryInfo(contentManager.RootDirectory
+ "\\" + contentFolder);
if (!dir.Exists)
throw new DirectoryNotFoundException();
var result = new Dictionary<string, T>();
foreach (FileInfo file in dir.GetFiles("*.mp3"))
{
string key = Path.GetFileNameWithoutExtension(file.Name);
result[key] = contentManager.Load<T>(
contentManager.RootDirectory + "/" + contentFolder + "/" + key);
}
return result;
}
Можете да го използвате по следния начин:
var songs = Content.LoadContent<Song>("Songs");
Леко подобрение на този код...
След като накарате горния код да работи, предлагам също да направите лека промяна:
var dir = new DirectoryInfo(
System.IO.Path.Combine(contentManager.RootDirectory, contentFolder));
Не трябва ръчно да създавате пътища чрез конкатенация на низове, когато е възможно да го избегнете. Не знам дали можете да направите същото за ContentManager
пътища, така че може да се наложи да се придържате към конкатенация на низове за този случай.
Редактиране: Твърде много конструкции, които все още не сте използвали в класа
Тъй като не сте използвали методи за разширение или ключовата дума static
във вашия клас все още и вероятно не сте използвали речници, ето по-лесен начин за направите това:
string contentFolder = "Music";
var dir = new DirectoryInfo(Content.RootDirectory + "\\" + contentFolder);
if (!dir.Exists)
{
// Todo: Display a message to the user instead?
throw new DirectoryNotFoundException();
}
string[] files = dir.GetFiles("*.mp3");
for (int i = 0; i < files.Count(); ++i)
{
FileInfo file = files[i];
string key = System.IO.Path.GetFileNameWithoutExtension(file.Name);
var song = Content.Load<Song>(
Content.RootDirectory + "/" + contentFolder + "/" + key);
songsToPlay.Add(song);
}
Edit2: Някои обяснения на този втори примерен код
Класът DirectoryInfo
ви позволява да заредите директория, така че може да изброи всички файлове в него.
Методът GetFiles
на DirectoryInfo
ви позволява да изброявате файлове, като използвате шаблон за съвпадение на стил със заместващи символи . Съвпадението на образец с заместващи символи за файлове означава, че когато са дадени тези шаблони:
*.*
- търсите файлове с име <anything>.<anything>
*.mp3
- търсите <anything>.mp3
throw
означава хвърляне на изключение. Това умишлено ще спре изпълнението на кода и ще покаже добро съобщение за грешка („директорията не е намерена“) и номер на ред. Има много да научите за обработката на изключения, така че няма да се опитвам да го оправдая с описание тук.
GetFileNameWithoutExtension
трябва да е очевидно, защото е добре наименуван .
Content.RootDirectory + "/" + contentFolder + "/" + key
Това последно малко код ще изгради низ, съдържащ главната директория на съдържанието, поддиректорията на вашите песни и всяко име на файл, използвайки име, което може да разбере (тъй като не знае за разширенията на имената на файловете).
var
означава „какъвто тип му присвоя“. Това е пряк път. Например, вместо да пишете:
List<string> someList = new List<string>();
Вие пишете:
var someList = new List<string>();
var
трябва да знае какъв тип е от дясната страна на заданието. Полезно е, защото можете да избягвате да се повтаряте.
Използването на var
обаче не дава никакви магически способности на променливата. Няма да можете да присвоите променлива от различен тип, след като сте декларирали променливата. Това е просто пряк път за абсолютно същата функционалност.
person
Merlyn Morgan-Graham
schedule
07.01.2012