Libmagicxx v10.0.3
A modern C++23 wrapper for libmagic — the library that powers the Unix file command.
Loading...
Searching...
No Matches
magic_examples.cpp
/* SPDX-FileCopyrightText: Copyright (c) 2022-2026 Oğuz Toraman <oguz.toraman@tutanota.com> */
/* SPDX-License-Identifier: LGPL-3.0-only */
#include <iostream>
#include <magic.hpp>
#include <print>
using namespace Recognition;
{
try {
if (!example_magic.IsValid()) {
std::println(std::cerr, "Magic is not valid.");
return;
}
auto type = example_magic.IdentifyFile(Magic::DEFAULT_DATABASE_FILE);
std::println(
std::cout,
"Magic::DEFAULT_DATABASE_FILE file type: {}",
type
);
} catch (const MagicException& e) {
std::println(std::cerr, "Error: {}", e.what());
}
}
{
Magic example_magic;
if (!example_magic.Open(Magic::Flags::Mime, std::nothrow)) {
std::println(std::cerr, "Failed to open magic.");
return;
}
if (example_magic.LoadDatabaseFile(std::nothrow)) {
auto result = example_magic.IdentifyFile(
std::nothrow
);
std::println(
std::cout,
"Noexcept Magic::DEFAULT_DATABASE_FILE file type: {}",
ToString(result)
);
} else {
std::println(std::cerr, "Failed to load database.");
}
}
{
try {
auto results = example_magic.IdentifyFiles(
std::filesystem::temp_directory_path()
);
std::println(
std::cout,
"Types in the temp directory (showing up to 10):"
);
for (const auto& result : results | std::views::take(10)) {
std::println(std::cout, "{}", ToString(result));
}
} catch (const MagicException& e) {
std::println(std::cerr, "Error: {}", e.what());
}
}
{
Magic example_magic;
example_magic.LoadDatabaseFile();
auto value = example_magic.GetParameter(Magic::Parameters::BytesMax);
std::println(std::cout, "BytesMax: {}", value);
auto flags = example_magic.GetFlags();
std::println(std::cout, "Flags: {}", ToString(flags));
}
{
if (Magic::Check()) {
std::println(std::cout, "Database check passed.");
} else {
std::println(std::cerr, "Database check failed.");
}
if (Magic::Compile()) {
std::println(std::cout, "Database compiled successfully.");
} else {
std::println(std::cerr, "Database compilation failed.");
}
}
{
try {
Magic example_magic{Magic::Flags::Mime};
auto results = example_magic.IdentifyFiles(
std::filesystem::temp_directory_path(),
tracker
);
std::println(
std::cout,
"Identified {} files. Completed: {}",
results.size(),
tracker->IsCompleted() ? "yes" : "no"
);
std::println(
std::cout,
"Final progress: {}",
tracker->GetCompletionPercentage().ToString()
);
} catch (const MagicException& e) {
std::println(std::cerr, "Error: {}", e.what());
}
}
{
try {
Magic example_magic{Magic::Flags::MimeType};
std::vector<std::filesystem::path> files = {
};
auto results = example_magic.IdentifyFiles(files);
std::println(std::cout, "Container identification results:");
for (const auto& result : results) {
std::println(std::cout, "{}", ToString(result));
}
} catch (const MagicException& e) {
std::println(std::cerr, "Error: {}", e.what());
}
}
{
Magic example_magic;
std::println(
std::cout,
"After default construction: IsOpen={}, IsDatabaseLoaded={}, IsValid={}",
example_magic.IsOpen(),
example_magic.IsDatabaseLoaded(),
example_magic.IsValid()
);
example_magic.Open(Magic::Flags::None);
std::println(
std::cout,
"After Open(): IsOpen={}, IsDatabaseLoaded={}, IsValid={}",
example_magic.IsOpen(),
example_magic.IsDatabaseLoaded(),
example_magic.IsValid()
);
example_magic.LoadDatabaseFile();
std::println(
std::cout,
"After LoadDatabaseFile(): IsOpen={}, IsDatabaseLoaded={}, IsValid={}",
example_magic.IsOpen(),
example_magic.IsDatabaseLoaded(),
example_magic.IsValid()
);
example_magic.SetFlags(Magic::Flags::Mime);
auto new_flags = example_magic.GetFlags();
std::println(std::cout, "After SetFlags(): {}", ToString(new_flags));
example_magic.Close();
std::println(
std::cout,
"After Close(): IsOpen={}, IsDatabaseLoaded={}, IsValid={}",
example_magic.IsOpen(),
example_magic.IsDatabaseLoaded(),
example_magic.IsValid()
);
}
{
std::println(std::cout, "Libmagic version: {}", Magic::GetVersion());
Magic example_magic{Magic::Flags::Mime};
auto all_params = example_magic.GetParameters();
std::println(std::cout, "All parameters: {}", ToString(all_params));
example_magic.SetParameters({
});
auto updated_params = example_magic.GetParameters();
std::println(
std::cout,
"After SetParameters(): {}",
ToString(updated_params)
);
}
auto main() -> int
{
std::println(std::cout, "--- Example 1: Basic Identify ---");
std::println(std::cout, "\n--- Example 2: Noexcept Identify ---");
std::println(std::cout, "\n--- Example 3: Directory Identify ---");
std::println(std::cout, "\n--- Example 4: Custom Flags/Parameters ---");
std::println(std::cout, "\n--- Example 5: Compile and Check ---");
std::println(std::cout, "\n--- Example 6: Progress Tracking ---");
std::println(std::cout, "\n--- Example 7: Container Identify ---");
std::println(std::cout, "\n--- Example 8: Lifecycle Management ---");
std::println(std::cout, "\n--- Example 9: Version and All Parameters ---");
return 0;
}
Base exception class for all Magic-related errors.
Definition magic_exception.hpp:102
A modern C++23 wrapper for libmagic — the library that powers the Unix file command.
Definition magic.hpp:216
static std::string_view DEFAULT_DATABASE_FILE
Path to the default magic database file.
Definition magic.hpp:431
void LoadDatabaseFile(const std::filesystem::path &database_file=DEFAULT_DATABASE_FILE)
Load a magic database file.
Definition magic.cpp:2638
FileTypeT IdentifyFile(const std::filesystem::path &path) const
Identify the type of a single file.
Definition magic.cpp:2530
FileTypeMapT IdentifyFiles(const std::filesystem::path &directory, std::filesystem::directory_options option=std::filesystem::directory_options::follow_directory_symlink) const
Identify all files in a directory.
Definition magic.hpp:1037
FlagsContainerT GetFlags() const
Get the current flags.
Definition magic.cpp:2488
void SetFlags(FlagsMaskT flags_mask)
Set new flags for the Magic instance.
Definition magic.cpp:2674
void Close() noexcept
Close the Magic instance.
Definition magic.cpp:2476
static bool Compile(const std::filesystem::path &database_file=DEFAULT_DATABASE_FILE) noexcept
Compile a magic database file.
Definition magic.cpp:2481
@ Mime
Definition magic.hpp:328
@ Compress
Definition magic.hpp:319
@ None
Definition magic.hpp:316
@ MimeType
Definition magic.hpp:321
@ RegexMax
Definition magic.hpp:388
@ BytesMax
Definition magic.hpp:389
std::string ToString(const Magic::FileTypeEntryT &file_type_entry, const std::string &type_separator=" -> ")
Convert a file type entry to a string.
Definition magic.cpp:2293
SharedProgressTrackerT MakeSharedProgressTracker(std::uint64_t total_steps=1u) noexcept
Factory function to create a shared ProgressTracker.
Definition progress_tracker.hpp:440
void Open(FlagsMaskT flags_mask)
Open Magic with specified flags.
Definition magic.cpp:2651
ParameterValueMapT GetParameters() const
Get all parameter values.
Definition magic.cpp:2513
std::size_t GetParameter(Parameters parameter) const
Get the value of a specific parameter.
Definition magic.cpp:2500
void SetParameter(Parameters parameter, std::size_t value)
Set a single parameter value.
Definition magic.cpp:2697
void SetParameters(const ParameterValueMapT &parameters)
Set multiple parameter values.
Definition magic.cpp:2711
bool IsValid() const noexcept
Check if the Magic instance is valid for file identification.
Definition magic.cpp:2633
bool IsOpen() const noexcept
Check if the Magic instance is open.
Definition magic.cpp:2628
bool IsDatabaseLoaded() const noexcept
Check if a magic database is loaded.
Definition magic.cpp:2623
static std::string GetVersion() noexcept
Get the libmagic library version.
Definition magic.cpp:2525
static bool Check(const std::filesystem::path &database_file=DEFAULT_DATABASE_FILE) noexcept
Check magic database file for validity.
Definition magic.cpp:2469
Main header file for the libmagicxx library.
void ExampleCustomFlagsParameters()
Example 4: Configuring flags and parameters.
Definition magic_examples.cpp:179
void ExampleBasicIdentify()
Example 1: Basic file identification with exception handling.
Definition magic_examples.cpp:65
void ExampleVersionAndAllParameters()
Example 9: Get version and all parameters.
Definition magic_examples.cpp:374
auto main() -> int
Main entry point for the examples program.
Definition magic_examples.cpp:402
void ExampleProgressTracking()
Example 6: Progress tracking for batch operations.
Definition magic_examples.cpp:242
void ExampleNoexceptIdentify()
Example 2: File identification using the noexcept API.
Definition magic_examples.cpp:101
void ExampleCheckAndCompile()
Example 5: Database validation and compilation.
Definition magic_examples.cpp:211
void ExampleContainerIdentify()
Example 7: Identify specific files from a container.
Definition magic_examples.cpp:281
void ExampleIdentifyDirectory()
Example 3: Batch identification of files in a directory.
Definition magic_examples.cpp:140
void ExampleLifecycleManagement()
Example 8: Manual lifecycle and state queries.
Definition magic_examples.cpp:319
Root namespace for the libmagicxx library.