ایجاد و مدیریت فایل‌های PST

علاوه بر تجزیه یک فایل PST موجود، Aspose.Email ابزارهایی برای ایجاد یک فایل PST از ابتدا فراهم می‌کند. این مقاله نشان می‌دهد چگونه فایل‌های Outlook PST ایجاد کرده و زیرپوشه‌ها یا پیام‌ها را به آن‌ها اضافه کنید.

ایجاد فایل‌های PST

برای ایجاد یک فایل PST جدید بر روی دیسک محلی، نیاز دارید از PersonalStorage کلاس. با این کلاس می‌توانید فایل‌های PST را در برنامه‌های .NET خود ایجاد، بخوانید و دستکاری کنید. یک فایل ذخیره‌ساز از صفر با یک خط کد ایجاد کنید:

// Create new PST
using var pst = PersonalStorage.Create(path, FileFormatVersion.Unicode);

اضافه کردن زیرپوشه‌ها به PST

یک زیرپوشه در ریشه فایل PST اضافه کنید با دسترسی به پوشه Root و سپس فراخوانی AddSubFolder متد.

قطعه کد زیر نشان می‌دهد چگونه یک زیرپوشه به نام Inbox اضافه کنید:

// Add new folder "Test"
pst.RootFolder.AddSubFolder("Inbox");

بررسی کلاس مخزن پوشه

هنگام ایجاد پوشه‌های جدید یا افزودن اقلام به پوشه‌های موجود، مهم است که کلاس مخزن مورد جدید یا پوشه با کلاس مخزن پوشه والد هم‌راستا باشد تا ساختار سلسله‌مراتبی سازمانی در فایل ذخیره‌ساز PST حفظ شود. برای این منظور، Aspose.Email این امکان را دارد EnforceContainerClassMatching ویژگی FolderCreationOptions کلاس. این ویژگی مشخص می‌کند که آیا بررسی کلاس مخزن پوشه اضافه شده در برابر کلاس مخزن پوشه والد اعمال شود یا نه. اگر روی ’true’ تنظیم شود، در صورت عدم تطابق کلاس‌های مخزن، استثنا پرتاب می‌شود. مقدار پیش‌فرض ‘false’ است.

نمونه کد زیر استفاده از EnforceContainerClassMatching ویژگی برای کنترل این که آیا هنگام افزودن پوشه‌هایی با کلاس‌های کانتینر ناسازگار استثناء پرتاب شود یا نه:

using (var pst = PersonalStorage.Create("storage.pst", FileFormatVersion.Unicode))
{
    // Create a standard Contacts folder with the IPF.Contacts container class.
    var contacts = pst.CreatePredefinedFolder("Contacts", StandardIpmFolder.Contacts);
    
    // An exception will not arise. EnforceContainerClassMatching is false by default.
    contacts.AddSubFolder("Subfolder1", "IPF.Note");
    
    // An exception will occur as the container class of the subfolder being added (IPF.Note) 
    // does not match the container class of the parent folder (IPF.Contact).
    contacts.AddSubFolder("Subfolder3", new FolderCreationOptions {EnforceContainerClassMatching = true, ContainerClass = "IPF.Note"});
}

نکته: هنگام اعمال تطبیق کلاس کانتینر، اطمینان حاصل کنید که استثناها به‌درستی مدیریت شوند تا از رفتارهای غیرمنتظره در حین ایجاد پوشه در PST جلوگیری شود.

تغییر کلاس کانتینر پوشه

گاهی لازم است کلاس کانتینر پوشه تغییر یابد. مثال رایج این است که پیام‌های انواع مختلف (قرارها، پیام‌ها و غیره) به یک پوشه اضافه می‌شوند. در این موارد، کلاس پوشه برای تمام عناصر داخل پوشه باید تغییر کند تا به‌درستی نمایش داده شوند. قطعه کد زیر نشان می‌دهد چگونه کلاس کانتینر یک پوشه در PST را برای این منظور تغییر دهید.

using var pst = PersonalStorage.FromFile("PersonalStorage1.pst);
var folder = pst.RootFolder.GetSubFolder("Inbox");

folder.ChangeContainerClass("IPF.Note");

اضافه کردن فایل‌ها به PST

عملکرد کلیدی Microsoft Outlook مدیریت ایمیل‌ها، تقویم‌ها، کارها، مخاطبین و ورودی‌های ژورنال است. علاوه بر این، می‌توان فایل‌ها را به یک پوشه PST اضافه کرد و PST حاصل، سوابق اسناد اضافه شده را نگه می‌دارد. Aspose.Email امکان افزودن فایل‌ها به یک پوشه را به همان شیوه‌ای که پیام‌ها، مخاطبین، کارها و ورودی‌های ژورنال به PST اضافه می‌شوند، فراهم می‌کند. قطعه کد زیر نشان می‌دهد چگونه اسناد را به یک پوشه PST با استفاده از Aspose.Email اضافه کنید.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using (var personalStorage = PersonalStorage.Create(dataDir + "Ps1_out.pst", FileFormatVersion.Unicode))
{
    var folder = personalStorage.RootFolder.AddSubFolder("Files");

    // Add Document.doc file with the "IPM.Document" message class by default.
    folder.AddFile(dataDir + "attachment_1.doc", null);
}

افزودن پیام‌ها به فایل‌های PST

با Aspose.Email می‌توانید پیام‌ها را به زیرپوشه‌های یک فایل PST که ایجاد یا بارگذاری کرده‌اید، اضافه کنید. این مقاله دو پیام را از دیسک به زیرپوشه Inbox یک PST اضافه می‌کند. از PersonalStorage و FolderInfo کلاس‌ها برای افزودن پیام‌ها به فایل‌های PST. برای افزودن پیام‌ها به پوشه Inbox یک فایل PST:

  1. یک نمونه از کلاس FolderInfo ایجاد کنید و آن را با محتویات پوشه Inbox بارگذاری کنید.
  2. پیام‌ها را از دیسک به پوشه Inbox اضافه کنید با فراخوانی FolderInfo.AddMessage() متد. FolderInfo کلاس موارد زیر را در دسترس قرار می‌دهد AddMessages متدی که امکان افزودن تعداد زیادی پیام به پوشه را فراهم می‌کند، عملیات I/O به دیسک را کاهش داده و عملکرد را بهبود می‌بخشد.

قطعه کد زیر نشان می‌دهد چگونه پیام‌ها را به زیرپوشه‌ای به نام Inbox در PST اضافه کنید.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create new PST            
var personalStorage = PersonalStorage.Create(dataDir, FileFormatVersion.Unicode);

// Add new folder "Inbox"
personalStorage.RootFolder.AddSubFolder("Inbox");

// Select the "Inbox" folder
var inboxFolder = personalStorage.RootFolder.GetSubFolder("Inbox");

// Add some messages to "Inbox" folder
inboxFolder.AddMessage(MapiMessage.FromFile(RunExamples.GetDataDir_Outlook() + "MapiMsgWithPoll.msg"));

افزودن پیام‌های دسته‌جمعی با عملکرد بهبود یافته

افزودن پیام‌های فردی به یک PST شامل عملیات I/O بیشتری بر روی دیسک می‌شود و ممکن است عملکرد را کاهش دهد. برای بهبود عملکرد، می‌توان پیام‌ها را به صورت حجمی به PST اضافه کرد تا عملیات I/O به حداقل برسد. AddMessages متد به شما امکان می‌دهد پیام‌ها را به صورت دسته‌جمعی اضافه کنید و می‌تواند در سناریوهای زیر استفاده شود. علاوه بر این، MessageAdded رویداد زمانی رخ می‌دهد که پیامی به پوشه اضافه شود.

افزودن پیام‌ها از PST دیگر

برای افزودن پیام‌ها از یک PST دیگر، از FolderInfo.EnumerateMapiMessages متد که برمی‌گرداند IEnumerable<MapiMessage>:

using var srcPst = PersonalStorage.FromFile(@"source.pst", false);
using var destPst = PersonalStorage.FromFile(@"destination.pst");

// Get the folder by name
var srcFolder = srcPst.RootFolder.GetSubFolder("SomeFolder");
var destFolder = destPst.RootFolder.GetSubFolder("SomeFolder");

destFolder.MessageAdded += new MessageAddedEventHandler(OnMessageAdded);
destFolder.AddMessages(srcFolder.EnumerateMapiMessages());


// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine($"Added: {e.EntryId}");
}

افزودن پیام‌ها از دایرکتوری

برای افزودن پیام‌ها از دایرکتوری، ایجاد کنید GetMessages(string pathToDir) متد تکرارگر نام‌گذاری‌شده که باز می‌گرداند IEnumerable<MapiMessage>:

using var pst = PersonalStorage.FromFile(@"storage.pst");
var folder = pst.RootFolder.GetSubFolder("SomeFolder");
folder.MessageAdded += OnMessageAdded;
folder.AddMessages(GetMessages(@"MessageDirectory"));

// Named iterator method to read messages from directory.
static IEnumerable<MapiMessage> GetMessages(string pathToDir)
{
    string[] files = Directory.GetFiles(pathToDir, "*.msg");

    foreach (var file in files)
    {
        yield return MapiMessage.Load(file);
    }
}

// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine($"Added: {e.EntryId}");
}

بارگذاری پیام‌ها از دیسک

قطعه کد زیر نشان می‌دهد چگونه پیام‌ها را از دیسک بارگذاری کنید.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
private static void AddMessagesInBulkMode(string fileName, string msgFolderName)
{
    using (PersonalStorage personalStorage = PersonalStorage.FromFile(fileName))
    {
        FolderInfo folder = personalStorage.RootFolder.GetSubFolder("myInbox");
        folder.MessageAdded += OnMessageAdded;
        folder.AddMessages(new MapiMessageCollection(msgFolderName));
    }
}
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine(e.EntryId);
    Console.WriteLine(e.Message.Subject);
}

پیاده‌سازی IEnumerable

قطعه کد زیر نشان می‌دهد چگونه می‌توان از پیاده‌سازی IEnumerable استفاده کرد.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public class MapiMessageCollection : IEnumerable<MapiMessage>
{
    private string path;

    public MapiMessageCollection(string path)
    {
        this.path = path;
    }

    public IEnumerator<MapiMessage> GetEnumerator()
    {
        return new MapiMessageEnumerator(path);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class MapiMessageEnumerator : IEnumerator<MapiMessage>
{
    private readonly string[] files;

    private int position = -1;

    public MapiMessageEnumerator(string path)
    {
        string path1 = RunExamples.GetDataDir_Outlook();
        files = Directory.GetFiles(path1);
    }

    public bool MoveNext()
    {
        position++;
        return (position < files.Length);
    }

    public void Reset()
    {
        position = -1;
    }

    object IEnumerator.Current
    {
        get
        {
            return Current;
        }
    }

    public MapiMessage Current
    {
        get
        {
            try
            {
                return MapiMessage.FromFile(files[position]);
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
    public void Dispose()
    {
    }
}