Print absolute paths when file not found
This is helpful when debugging why files won't load. By printing the whole path we're making it more clear to the user exactly what file is failing to load.
This commit is contained in:
parent
c7705a8d9a
commit
f8c1ec283a
@ -36,6 +36,7 @@
|
|||||||
#include <SFML/System/FileInputStream.hpp>
|
#include <SFML/System/FileInputStream.hpp>
|
||||||
#include <SFML/System/MemoryInputStream.hpp>
|
#include <SFML/System/MemoryInputStream.hpp>
|
||||||
#include <SFML/System/Err.hpp>
|
#include <SFML/System/Err.hpp>
|
||||||
|
#include <SFML/System/Utils.hpp>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
|
||||||
|
|
||||||
@ -74,7 +75,7 @@ std::unique_ptr<SoundFileReader> SoundFileFactory::createReaderFromFilename(cons
|
|||||||
// Wrap the input file into a file stream
|
// Wrap the input file into a file stream
|
||||||
FileInputStream stream;
|
FileInputStream stream;
|
||||||
if (!stream.open(filename)) {
|
if (!stream.open(filename)) {
|
||||||
err() << "Failed to open sound file " << filename << " (couldn't open stream)" << std::endl;
|
err() << "Failed to open sound file (couldn't open stream)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +93,7 @@ std::unique_ptr<SoundFileReader> SoundFileFactory::createReaderFromFilename(cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
// No suitable reader found
|
// No suitable reader found
|
||||||
err() << "Failed to open sound file " << filename << " (format not supported)" << std::endl;
|
err() << "Failed to open sound file (format not supported)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,7 +166,7 @@ std::unique_ptr<SoundFileWriter> SoundFileFactory::createWriterFromFilename(cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
// No suitable writer found
|
// No suitable writer found
|
||||||
err() << "Failed to open sound file " << filename << " (format not supported)" << std::endl;
|
err() << "Failed to open sound file (format not supported)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ bool SoundFileWriterFlac::open(const std::filesystem::path& filename, unsigned i
|
|||||||
m_encoder = FLAC__stream_encoder_new();
|
m_encoder = FLAC__stream_encoder_new();
|
||||||
if (!m_encoder)
|
if (!m_encoder)
|
||||||
{
|
{
|
||||||
err() << "Failed to write flac file " << filename << " (failed to allocate encoder)" << std::endl;
|
err() << "Failed to write flac file (failed to allocate encoder)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ bool SoundFileWriterFlac::open(const std::filesystem::path& filename, unsigned i
|
|||||||
// Initialize the output stream
|
// Initialize the output stream
|
||||||
if (FLAC__stream_encoder_init_file(m_encoder, filename.string().c_str(), nullptr, nullptr) != FLAC__STREAM_ENCODER_INIT_STATUS_OK)
|
if (FLAC__stream_encoder_init_file(m_encoder, filename.string().c_str(), nullptr, nullptr) != FLAC__STREAM_ENCODER_INIT_STATUS_OK)
|
||||||
{
|
{
|
||||||
err() << "Failed to write flac file " << filename << " (failed to open the file)" << std::endl;
|
err() << "Failed to write flac file (failed to open the file)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
close();
|
close();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ bool SoundFileWriterOgg::open(const std::filesystem::path& filename, unsigned in
|
|||||||
int status = vorbis_encode_init_vbr(&m_vorbis, static_cast<long>(channelCount), static_cast<long>(sampleRate), 0.4f);
|
int status = vorbis_encode_init_vbr(&m_vorbis, static_cast<long>(channelCount), static_cast<long>(sampleRate), 0.4f);
|
||||||
if (status < 0)
|
if (status < 0)
|
||||||
{
|
{
|
||||||
err() << "Failed to write ogg/vorbis file " << filename << " (unsupported bitrate)" << std::endl;
|
err() << "Failed to write ogg/vorbis file (unsupported bitrate)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
close();
|
close();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -89,7 +89,7 @@ bool SoundFileWriterOgg::open(const std::filesystem::path& filename, unsigned in
|
|||||||
m_file.open(filename.c_str(), std::ios::binary);
|
m_file.open(filename.c_str(), std::ios::binary);
|
||||||
if (!m_file)
|
if (!m_file)
|
||||||
{
|
{
|
||||||
err() << "Failed to write ogg/vorbis file " << filename << " (cannot open file)" << std::endl;
|
err() << "Failed to write ogg/vorbis file (cannot open file)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
close();
|
close();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -104,7 +104,7 @@ bool SoundFileWriterOgg::open(const std::filesystem::path& filename, unsigned in
|
|||||||
vorbis_comment_clear(&comment);
|
vorbis_comment_clear(&comment);
|
||||||
if (status < 0)
|
if (status < 0)
|
||||||
{
|
{
|
||||||
err() << "Failed to write ogg/vorbis file " << filename << " (cannot generate the headers)" << std::endl;
|
err() << "Failed to write ogg/vorbis file (cannot generate the headers)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
close();
|
close();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -102,14 +102,14 @@ bool SoundFileWriterWav::open(const std::filesystem::path& filename, unsigned in
|
|||||||
m_file.open(filename.c_str(), std::ios::binary);
|
m_file.open(filename.c_str(), std::ios::binary);
|
||||||
if (!m_file)
|
if (!m_file)
|
||||||
{
|
{
|
||||||
err() << "Failed to open WAV sound file " << filename << " for writing" << std::endl;
|
err() << "Failed to open WAV sound file for writing\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the header
|
// Write the header
|
||||||
if (!writeHeader(sampleRate, channelCount))
|
if (!writeHeader(sampleRate, channelCount))
|
||||||
{
|
{
|
||||||
err() << "Failed to write header of WAV sound file " << filename << std::endl;
|
err() << "Failed to write header of WAV sound file\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <SFML/System/InputStream.hpp>
|
#include <SFML/System/InputStream.hpp>
|
||||||
#include <SFML/System/Err.hpp>
|
#include <SFML/System/Err.hpp>
|
||||||
|
#include <SFML/System/Utils.hpp>
|
||||||
#include <ft2build.h>
|
#include <ft2build.h>
|
||||||
#include FT_FREETYPE_H
|
#include FT_FREETYPE_H
|
||||||
#include FT_GLYPH_H
|
#include FT_GLYPH_H
|
||||||
@ -159,7 +160,7 @@ bool Font::loadFromFile(const std::filesystem::path& filename)
|
|||||||
FT_Library library;
|
FT_Library library;
|
||||||
if (FT_Init_FreeType(&library) != 0)
|
if (FT_Init_FreeType(&library) != 0)
|
||||||
{
|
{
|
||||||
err() << "Failed to load font " << filename << " (failed to initialize FreeType)" << std::endl;
|
err() << "Failed to load font (failed to initialize FreeType)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
fontHandles->library.reset(library);
|
fontHandles->library.reset(library);
|
||||||
@ -168,7 +169,7 @@ bool Font::loadFromFile(const std::filesystem::path& filename)
|
|||||||
FT_Face face;
|
FT_Face face;
|
||||||
if (FT_New_Face(library, filename.string().c_str(), 0, &face) != 0)
|
if (FT_New_Face(library, filename.string().c_str(), 0, &face) != 0)
|
||||||
{
|
{
|
||||||
err() << "Failed to load font " << filename << " (failed to create the font face)" << std::endl;
|
err() << "Failed to load font (failed to create the font face)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
fontHandles->face.reset(face);
|
fontHandles->face.reset(face);
|
||||||
@ -177,7 +178,7 @@ bool Font::loadFromFile(const std::filesystem::path& filename)
|
|||||||
FT_Stroker stroker;
|
FT_Stroker stroker;
|
||||||
if (FT_Stroker_New(library, &stroker) != 0)
|
if (FT_Stroker_New(library, &stroker) != 0)
|
||||||
{
|
{
|
||||||
err() << "Failed to load font " << filename << " (failed to create the stroker)" << std::endl;
|
err() << "Failed to load font (failed to create the stroker)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
fontHandles->stroker.reset(stroker);
|
fontHandles->stroker.reset(stroker);
|
||||||
@ -185,7 +186,7 @@ bool Font::loadFromFile(const std::filesystem::path& filename)
|
|||||||
// Select the unicode character map
|
// Select the unicode character map
|
||||||
if (FT_Select_Charmap(face, FT_ENCODING_UNICODE) != 0)
|
if (FT_Select_Charmap(face, FT_ENCODING_UNICODE) != 0)
|
||||||
{
|
{
|
||||||
err() << "Failed to load font " << filename << " (failed to set the Unicode character set)" << std::endl;
|
err() << "Failed to load font (failed to set the Unicode character set)\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ bool ImageLoader::loadImageFromFile(const std::filesystem::path& filename, std::
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Error, failed to load the image
|
// Error, failed to load the image
|
||||||
err() << "Failed to load image " << filename << ". Reason: " << stbi_failure_reason() << std::endl;
|
err() << "Failed to load image\n" << formatDebugPathInfo(filename) << "\nReason: " << stbi_failure_reason() << std::endl;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -278,7 +278,7 @@ bool ImageLoader::saveImageToFile(const std::filesystem::path& filename, const s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err() << "Failed to save image " << filename << std::endl;
|
err() << "Failed to save image\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include <SFML/Window/Context.hpp>
|
#include <SFML/Window/Context.hpp>
|
||||||
#include <SFML/System/InputStream.hpp>
|
#include <SFML/System/InputStream.hpp>
|
||||||
#include <SFML/System/Err.hpp>
|
#include <SFML/System/Err.hpp>
|
||||||
|
#include <SFML/System/Utils.hpp>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -260,7 +261,7 @@ bool Shader::loadFromFile(const std::filesystem::path& filename, Type type)
|
|||||||
std::vector<char> shader;
|
std::vector<char> shader;
|
||||||
if (!getFileContents(filename, shader))
|
if (!getFileContents(filename, shader))
|
||||||
{
|
{
|
||||||
err() << "Failed to open shader file " << filename << std::endl;
|
err() << "Failed to open shader file\n" << formatDebugPathInfo(filename) << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,8 @@
|
|||||||
// Headers
|
// Headers
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
@ -40,6 +42,15 @@ namespace sf
|
|||||||
c = static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
|
c = static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] inline std::string formatDebugPathInfo(const std::filesystem::path& path)
|
||||||
|
{
|
||||||
|
std::ostringstream stream;
|
||||||
|
stream << " Provided path: " << path << '\n';
|
||||||
|
stream << " Absolute path: " << std::filesystem::absolute(path);
|
||||||
|
return stream.str();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace sf
|
} // namespace sf
|
||||||
|
|
||||||
#endif // SFML_UTILS_HPP
|
#endif // SFML_UTILS_HPP
|
||||||
|
Loading…
Reference in New Issue
Block a user