Класс C # SoundPlayer не находит файл по указанному пути - PullRequest
0 голосов
/ 14 октября 2019

Я использую Path.GetFullPath пространства имен System.IO, и он правильно извлекает абсолютный путь к файлу для звукового файла, который я сохранил в программе. Он отображает его в MessageBox, и путь к файлу определенно правильный. Однако когда я вызываю тот же самый путь к файлу с помощью SoundPlayer, он говорит, что звукового файла в этом месте не существует. Я не вижу абсолютно ничего плохого в моем коде.

сообщение об ошибке

абсолютный путь к файлу

где файл находитсяхранится в обозревателе решений

1 Ответ

1 голос
/ 14 октября 2019

Path.GetFullPath возвращает заполненный путь на основе вашей строки неполного пути и вашего текущего каталога

Текущий каталог, если вы запустите свой скомпилированный исполняемый файл, например, из проводника Windows, будетнапример, bin / Debug, вы дважды щелкаете по нему.

Если вы запустите его из отладчика Visual Studio, текущим путем будет каталог решения или проекта (не помню), по умолчанию в любом случае.

Таким образом, эта схема получения пути к файлу не работает, если вы хотите сделать оба: иногда запускаются из Visual Studio, а иногда напрямую (например, если вы копируете двоичные файлы кому-то еще, чтобы попробовать нашклассная программа). Попробуйте выполнить следующее:

  • в каталоге решений, например, есть папка «data» , кроме папка bin, ваши исходные файлы и т. Д. - при условии, что вы используете макет папки по умолчанию с именем«bin», где папки Debug и Release для двоичных файлов
  • используют надежный метод для получения абсолютного пути к вашему исполняемому файлу
  • используют ваши знания структуры каталогов для «педалирования назад»из исполняемой папки в папку «data», где может находиться ваш аудиофайл (напрямую, или, может быть, в подпапке «audio»?)

Это может выглядеть так:

using System.IO;
// ...
public static string GetExeDirSubPath(string subPath)
{
    return new DirectoryInfo( Path.Combine( GetExeDirPath(), subPath ) ).FullName; // DI stripts dtuff  like "..\..\" and moves to the actual path
}

public static string GetExeDirPath()
{
    System.Reflection.Assembly a = System.Reflection.Assembly.GetEntryAssembly();
    string baseDir = System.IO.Path.GetDirectoryName(a.Location);
    return baseDir;
}

Затем, предполагая вышеизложенную структуру каталогов, вы получите полный путь к аудиофайлу:

// first "..": go from Debug or Release folder of your exe to bin
// second "..": go from bin to the folder containing both: bin and data folders
var fullpath = GetExeDirSubPath( "../../data/audio/silly_sound.wav" );
...