Containers CFB

Containers CFB

Compound File Binary (CFB) é o formato de container usado pelo Outlook .msg Este guia mostra como ler, atravessar e escrever CFB contêineres usando CfbReader, CfbWriter, e CfbDocument de Aspose.Email FOSS para .NET.


Leitura de Containers CFB

Abrir um arquivo CFB

Criar um CfbReader a partir de um caminho de arquivo, uma corrente ou uma matriz de bytes para abrir o contêiner CFB e começar a ler as entradas do diretório:

using Aspose.Email.Foss.Cfb;

// From file
using var reader = CfbReader.FromFile("sample.msg");

// From stream
using var stream = File.OpenRead("sample.msg");
using var reader2 = CfbReader.FromStream(stream);

// From byte array
var data = File.ReadAllBytes("sample.msg");
using var reader3 = new CfbReader(data);

Inspecionar cabeçalho e estrutura

Leia as propriedades do cabeçalho em: CfbReader Para inspecionar o tamanho dos setores, a contagem de entradas e o total do arquivo:

Console.WriteLine($"Version: {reader.MajorVersion}");
Console.WriteLine($"Sector size: {reader.SectorSize}");
Console.WriteLine($"Mini-sector size: {reader.MiniSectorSize}");
Console.WriteLine($"Directory entries: {reader.DirectoryEntryCount}");
Console.WriteLine($"Streams materialized: {reader.MaterializedStreamCount}");
Console.WriteLine($"File size: {reader.FileSize}");

Cruze a árvore de diretório

Chama-me . IterTree() para uma travessia completa recursiva com anotações de profundidade, ou utilização IterStorages() e a) IterStreams() Enumerar apenas as entradas de armazenamento ou de fluxo, respectivamente:

// Full recursive traversal with depth
foreach (var (depth, entry) in reader.IterTree())
{
    var indent = new string(' ', depth * 2);
    Console.WriteLine($"{indent}{entry.Name} [{entry.ObjectType}]");
}

// Iterate only storages
foreach (var entry in reader.IterStorages())
    Console.WriteLine($"Storage: {entry.Name}");

// Iterate only streams
foreach (var entry in reader.IterStreams())
    Console.WriteLine($"Stream: {entry.Name} ({entry.StreamSize} bytes)");

Orienta as crianças e resolve os caminhos

Utilização: IterChildren() Enumerar os filhos diretos de uma determinada entrada de armazenamento, e ResolvePath() para localizar um fluxo pela sua sequência de nomes e ler os seus bytes:

// Direct children of the root
foreach (var entry in reader.IterChildren(CfbConstants.RootStreamId))
    Console.WriteLine(entry.Name);

// Resolve a nested path
var target = reader.ResolvePath(new[] { "__substg1.0_0037001F" });
if (target != null)
{
    var streamData = reader.GetStreamData(target.StreamId);
    Console.WriteLine($"Stream data: {streamData.Length} bytes");
}

Encontre o nome de uma criança

Chama-me . FindChildByName() com um ID de fluxo e uma sequência de nomes para localizar uma entrada submetida específica e ler os seus bytes brutos:

var child = reader.FindChildByName(CfbConstants.RootStreamId, "__properties_version1.0");
if (child != null)
{
    var bytes = reader.GetStreamData(child.StreamId);
    Console.WriteLine($"Property stream: {bytes.Length} bytes");
}

Escrever contêineres CFB

Criar um documento CFB

Criar um CfbStorage nó de raiz, adicionar CfbStream e aninhada. CfbStorage crianças, então enrolar em um CfbDocument Objeto:

using Aspose.Email.Foss.Cfb;

var root = new CfbStorage("Root Entry");
root.AddStream(new CfbStream("data.bin", new byte[] { 0x01, 0x02, 0x03 }));

var subStorage = new CfbStorage("SubFolder");
subStorage.AddStream(new CfbStream("nested.txt", System.Text.Encoding.UTF8.GetBytes("hello")));
root.AddStorage(subStorage);

var document = new CfbDocument(root);

Serialização em Bytes ou Arquivo

Passa o… CfbDocument a) para o CfbWriter.ToBytes() para obter um array de bytes, ou chamar CfbWriter.WriteFile() para escrever o contêiner serializado diretamente no disco:

// To byte array
byte[] cfbBytes = CfbWriter.ToBytes(document);

// To file
CfbWriter.WriteFile(document, "output.cfb");

Verificação de ida e volta

Escreva o documento com: CfbWriter.WriteFile(), então abre-o novamente com CfbReader.FromFile() Para verificar se as entradas escritas são legíveis:

// Write and reload
CfbWriter.WriteFile(document, "test.cfb");
using var reloaded = CfbReader.FromFile("test.cfb");

foreach (var entry in reloaded.IterChildren(CfbConstants.RootStreamId))
    Console.WriteLine(entry.Name);

Carregar CFB existente como CfbDocument

Utilização: CfbDocument.FromFile() Para carregar um ficheiro CFB existente e aceder diretamente aos seus metadados de armazenamento raiz e versão:

var doc = CfbDocument.FromFile("sample.msg");
Console.WriteLine($"Root: {doc.Root.Name}");
Console.WriteLine($"Version: {doc.MajorVersion}.{doc.MinorVersion}");

Ver também:

Ver também:

 Português