Як читати файли на C++

Як читати файли на C++

Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single функції виклику. mapi_message::from_file() та mapi_message::from_stream() Завантажити The Повне повідомлення — суб’єкт, тіло, відправник, одержувач і додаток — в пам’ять Об’єкт без залежності Outlook або COM.

Крок 1 - Завантажити проект

Клонуйте репозиторій і додайте його до вашого CMakeLists.txt:

git clone https://github.com/aspose-email-foss/Aspose.Email-FOSS-for-Cpp.git
add_subdirectory(Aspose.Email-FOSS-for-Cpp)
target_link_libraries(your_target PRIVATE AsposeEmailFoss::AsposeEmailFoss)

Крок 2 — Включити заголовки

#include "aspose/email/foss/msg/mapi_message.hpp"

Цей єдиний гаджет забезпечує mapi_message Всі підтримують в aspose::email::foss::msg Названий простір.


Крок 3 — Завантажити повідомлення з шляху файлу

Використовуйте mapi_message::from_file() Коли у вас є а std::filesystem::path:

#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    const auto message = aspose::email::foss::msg::mapi_message::from_file(
        std::filesystem::path("sample.msg"));

    std::cout << "Subject: " << message.subject() << '\n';
    std::cout << "From:    " << message.sender_name()
              << " <" << message.sender_email_address() << ">\n";
    std::cout << "Body:    " << message.body() << '\n';
}

Крок 4 — Завантажити повідомлення з потоку

Використовуйте mapi_message::from_stream() Від будь-якого з них відходити std::istream Корисні для обробка даних, отриманих через мережу або з буфера в пам’яті:

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    std::cout << "Subject: " << message.subject() << '\n';
}

Завжди відкривайте потоки з std::ios::binary Щоб запобігти закінченню ліній Windows Переклад з пошкодження контейнера CFB.


Крок 5 — Ітерація приймачів

message.recipients() Повернення А std::vector від об’єктів, що приймають, кожний з яких display_name, email_addressrecipient_type Поля :

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    for (std::size_t i = 0; i < message.recipients().size(); ++i)
    {
        const auto& r = message.recipients()[i];
        std::cout << "[" << (i + 1) << "] "
                  << r.display_name << " <" << r.email_address << ">"
                  << " type=" << r.recipient_type << '\n';
    }
}

Крок 6 — Ітерати Анекси

message.attachments() Повернення А std::vector Прикметник об’єкта: кожен прикріплений предмет експонати filename, mime_type, data (з урахуванням вищезазначених причин), content_id,І та is_embedded_message() Проповідуватимуть :

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    for (std::size_t i = 0; i < message.attachments().size(); ++i)
    {
        const auto& a = message.attachments()[i];
        std::cout << "[" << (i + 1) << "] "
                  << a.filename << "  mime=" << a.mime_type
                  << "  bytes=" << a.data.size()
                  << "  embedded=" << (a.is_embedded_message() ? "yes" : "no")
                  << '\n';
    }
}

Поширені проблеми та виправлення

Порожні body() Після завантаження. Деякі повідомлення зберігають текст тільки в HTML-коробці. Нерухомість - перевірка message.html_body() Коли message.body() Повертає порожній ряд.

Потік відкрився без std::ios::binary. У Windows, текстові потоки перекладаються CRLF-секунди, тихо пошкоджуючи бінарні CFB-дані. Завжди відкривайте MSG файли з std::ios::binary.

msg_exception Завантажити файли, що виглядають як дійсні. Перевірте, чи є файл справжнім MSG (OLE Compound File).Файли, збережені деякими інструментами експортування, можуть бути простим текстом або MIME та Не можна розбивати на mapi_message::from_file().

recipients() Повертає порожній вектор. Старі файли іноді пропускають одержувача Столиця, але прийомники в магазині display_to Пропозиції доступу: доступ до них через message.get_property_value() З common_message_property_id::display_to та property_type_code::ptyp_string.

Великі обсяги даних в пам’яті. Іmapi_message::from_file() та from_stream() завантажити все повідомлення, включаючи всі біти додатків. Для великих файлів відкрийте Контейнерний контейнером з msg_reader Перевірка потоків прикріплення без повного Їх матеріалізують.

Часті запитання

У чому різниця між from_file() та from_stream()?

Обидва виробляють однакові mapi_message Об’єкт. from_file() Приймає а std::filesystem::path Відкрийте файл внутрішньо. from_stream() Читає від будь-який std::istream Ви надаєте — корисно, коли дані MSG вже знаходяться в пам’яті або Прибуття через сокет.

робить from_file() Чи можна відкрити файл після завантаження?

Файл відкривається, повністю завантажується в пам’ять і закривається до того, як він буде from_file() Ви можете перемістити або видалити джерельний файл відразу після виклику.

Чи можу я читати файли, створені Outlook на MacOS або Linux?

Формат MSG (вміст властивостей ОЛЕ Compound File + MAPI) переноситься по всьому Операційні системи: будь-який .msg Файл, створений будь-якою версією Outlook, можна відкрити. З mapi_message::from_file().

Як читати HTML тіло?

Телефонуйте message.html_body().Якщо повідомлення було створено лише з простою текстовою частиною, Це повертає порожній ряд. message.body() Повернення простого тексту.

Чи є строгий режим дефолтом?

mapi_message::from_file(path, strict) та from_stream(stream, strict) Прийняти а опціональний strict Боуліан: дефолт є false, що сприймає невеликі структурні Подібні файли використовуються в реальному світі.

Це також

 Українська