BitmapFrame.Ошибка создания с экранированными символами в Uri

#c# #wpf #uri

#c# #wpf #uri

Вопрос:

Я использую WPF / C # в VS2017. Мой код принимает путь к файлу изображения в виде строки и пытается загрузить его в BitmapFrame, который в основном работал нормально, за исключением того, что кто-то тестировал его с некоторыми файлами изображений с Mac, и это вызвало исключение. Оказывается, что имя файла содержит символ #F025, который в Windows отображается просто как толстая точка.

Файлы представляют собой фотографии, названные по названию фотографии. В этом был вопросительный знак, но в итоге получилось #F025.

В любом случае, код преобразует строку в Uri, а затем использует BitmapFrame следующим образом:

     public new void Init()
    {
        Source = new Uri(Path);
        fi = new FileInfo(Path);
        BitmapImage bs;
        try
        {
            Image = BitmapFrame.Create(Source);
            Metadata = new ExifMetadata(Image);
        }
        catch (Exception e)
        {
            Error = e.Message;
            IsBroken = true;
        }
  

Когда я смотрю на Uri «Source» в отладчике, символ # F025 заменяется на «%EF%80%A5». Функция Create выдает исключение «Файл не найден».

Есть ли какой-либо способ преобразовать это в Uri, который примет функция Create, или, возможно, просто использовать строковый путь для его загрузки вместо этого? Я пытался использовать поток с именем файла, но это тоже не сработало.

TIA.

Ответ №1:

Вы можете попытаться создать BitmapFrame из FileStream. Обратите внимание, что BitmapCacheOption.OnLoad должно быть установлено, чтобы иметь возможность закрыть поток сразу после вызова Create.

 using (var stream = File.OpenRead(Path))
{
    Image = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
  

Комментарии:

1. Большое спасибо, это сработало. Мне пришлось изменить это в нескольких других местах, но сейчас все работает отлично.