Невозможно переместить файл: процесс не может получить доступ к файлу, потому что он используется другим процессом - PullRequest
1 голос
/ 13 июля 2011

Сценарий: я написал приложение, чтобы открыть список MSG-файлов (которые были выгружены в файловую систему), получить некоторую информацию из них (предмет, в CC) и затем переместить их.

Проблема: Однако, когда дело доходит до перемещения файла, я получаю следующую ошибку:

Процесс не может получить доступ к файлу, потому что он используется другой процесс.

Запуск дескриптора для файла показывает только инструмент, который я написал, и никаких других дескрипторов.

Поэтому я предполагаю, что я не выпускаю файлы должным образом, когда закончу использовать их в качестве объектов Redemption MessageItem.

Но я не могу обернуть их в оператор использования, потому что они не реализуют IDisposable. И они не предоставляют никаких открытых методов Close или Dispose или методов с аналогичными именами.



Короче, я пытаюсь спросить:

a) Как заставить мое приложение c # закрыть данный дескриптор, зная только путь к дескриптору файла?

или

б) Есть ли способ заставить объекты Искупления закрыться?

var util = new MAPIUtilsClass();

MessageItem item = util.GetItemFromMsgFile(EmailPath, false);

item.Import(EmailPath, 3);

Subject = item.Subject;

From = (item.SenderName.Length < 96) ? item.SenderName : item.SenderName.Substring(0, 93) + "...";

To = (String.IsNullOrEmpty(item.To)) ? String.Empty : (item.To.Length < 96) ? item.To : item.To.Substring(0, 93) + "...";

CC = (String.IsNullOrEmpty(item.CC)) ? String.Empty : (item.CC.Length < 96) ? item.CC : item.CC.Substring(0, 93) + "...";

Sent = item.SentOn;

Received = item.ReceivedTime;

Log.Write("Redemption: Email data harvested" + EmailPath);

Ответы [ 3 ]

2 голосов
/ 13 июля 2011

Попробуйте позвонить util.CleanUp после того, как вы закончите.

1 голос
/ 13 июля 2011

Не используйте MAPIUtils.GetItemFromMsgFile - это устарело. Используйте RDOSession.GetMessageFromMsgFile (или CreateMessageFromMsgFile) - он возвращает объект IRDOMail, который поддерживает IDisposable.

0 голосов
/ 13 июля 2011

Используйте метод Util.CleanUp (), как было предложено Дэниелом, но немедленно выполните его с помощью GC.Collect () и поместите его в оператор finally для try-catch.

Итак, код теперь выглядит так:

    MAPIUtilsClass util = null;

    try
    {

        util = new MAPIUtilsClass();

        MessageItem item = util.GetItemFromMsgFile(EmailPath, false);

        item.Import(EmailPath, 3);

        Subject = item.Subject;

        From = (item.SenderName.Length < 96) ? item.SenderName : item.SenderName.Substring(0, 93) + "...";

        To = (String.IsNullOrEmpty(item.To)) ? String.Empty : (item.To.Length < 96) ? item.To : item.To.Substring(0, 93) + "...";

        CC = (String.IsNullOrEmpty(item.CC)) ? String.Empty : (item.CC.Length < 96) ? item.CC : item.CC.Substring(0, 93) + "...";

        Sent = item.SentOn;

        Received = item.ReceivedTime;

        util.Cleanup();

        Log.Write("Redemption: Email data harvested: " + EmailPath);


    }
    catch (Exception exp)
    {
        Log.Write(String.Format("Error using Redemption API against: {0}\r\n{1}\r\n{2}",
            this.EmailPath, exp.Message, exp.StackTrace));
    }

    finally
    {
        if (util != null)
            util.Cleanup();

        GC.Collect();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...