Почему параметр path для растрового изображения выдает «Исключение ArgumentException: Параметр недопустим» на Ubuntu Server 20.04?

#c# #.net #bitmap #discord.net

Вопрос:

Я решил позволить своему боту Discord работать на моем новом домашнем сервере Ubuntu 20.04.

Бот действительно работает на сервере, однако я получаю следующую ошибку, когда пытаюсь создать Bitmap из пути:

 System.ArgumentException: Parameter is not valid.
   at System.Drawing.SafeNativeMethods.Gdip.CheckStatus(Int32 status)
   at System.Drawing.Bitmap..ctor(String filename, Boolean useIcm)
   at Aurelia.ImageProcessor.ImageBuilder(String filename, String idolname, String group, String rarity, Int32 rar, String id, String pathDefiner) in /home/aurelia/discordBots/Aurelia/AureliaBot/Aurelia/ImageProcessor.cs:line 21
 

Если я отлаживаю его в VS на своем домашнем компьютере с Windows, я не получаю эту ошибку, и она работает нормально.

Я проверил каждый параметр, и каждый параметр должен быть в порядке.

 Bitmap cardTemp = new Bitmap($"assets\groups\{group}\{idolname}\{filename}");
Bitmap card = new Bitmap(cardTemp, 800, 1200);
Bitmap rareFrameTemp = new Bitmap($"assets\frames\{rarity}Frame.png");
 

Только первая строка выдает ошибку, и да, файл существует.
Спасибо!

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

1. Используйте / вместо в пути

2. Спасибо! Теперь это работает просто отлично!

3. рад это слышать

Ответ №1:

Проблема в том, что ваши пути, хотя они и работают для Windows, не будут работать для систем на базе Unix, поскольку они используют прямые косые / черты, а не обратные косые черты в качестве символа разделителя каталогов.

Используйте Path.Combine для кросс-платформенного решения.

Он будет использовать Path.DirectorySeparatorChar то, что обеспечит специфичный для платформы характер:

 var cardTempPath = Path.Combine("assets", "groups", group, idolname, filename);
var rareFrameTemp = Path.Combine("assets", "frames", $"{rarity}Frame.png");

Bitmap cardTemp = new Bitmap(cardTempPath);
Bitmap card = new Bitmap(cardTemp, 800, 1200);
Bitmap rareFrameTemp = new Bitmap(rareFrameTemp);