Если у вас есть файлы в содержимом вашего проекта, вы должны использовать класс 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