Как читать файлы на 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_address, и recipient_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 Файлы, сохраненные некоторыми инструментами экспорта, могут быть простым текстом или MIME и Не может быть рассеян по mapi_message::from_file().

recipients() Возвращает пустой вектор. Старики MSG иногда упускают получателя стол, но хранить дисплей получателей в 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 на Mac или Linux?

Формат MSG (свойства ОЛЕ Композитный файл + MAPI) переносится через Операционные системы. любой .msg Файл, созданный любой версией Outlook, можно открыть. с mapi_message::from_file().

Как читать тело HTML?

звонить message.html_body().Если сообщение было создано только с простой текстовой темой, Это возвращает пустую строку. message.body() Вернет тело простого текста.

Строгий режим – это дефолт?

mapi_message::from_file(path, strict) и from_stream(stream, strict) Принять 1 опционально strict Боулиан. дефолт является false, который терпит меньшие структурные Отклонения в реальных файлах.

Это тоже

 Русский