Как дождаться выпуска нового файла

Я создаю новый файл *.csv, и после его создания я хочу отправить этот файл в виде вложения по электронной почте, но файл заблокирован на 10-15 секунд. Есть ли способ дождаться освобождения файла, а затем отправить этот файл без каких-либо исключений: Процесс не может получить доступ к файлу, поскольку он используется другим процессом.

File.WriteAllText("test.csv", sb.ToString(),Encoding.UTF8);
SendMail();

 private static void SendMail()
    {
     MailMessage mail = new MailMessage("from", "to");
        SmtpClient client = new SmtpClient();
        client.Port = 25;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;
        client.Host = "host";
        mail.Subject = "this is subject";
        mail.Body = "this is body";
        mail.Attachments.Add(new Attachment("test.csv"));
        mail.IsBodyHtml = true;
        client.Send(mail);
}

Если я подожду с помощью Thread.Sleep(), я смогу успешно отправить электронное письмо, но я не хочу его использовать. Я не знаю точное время завершения файловой операции. Это консольное приложение. Какие-либо предложения?


person cihadakt    schedule 05.12.2013    source источник
comment
File.WriteAllText должен немедленно закрыть файл после его завершения. Что-то не так. Вы можете попробовать использовать StreamWriter и открывать и закрывать его явно. В противном случае, возможно, что-то вне вашего приложения вмешивается в него.   -  person Matt J.    schedule 05.12.2013
comment
Странно, но File.WriteAllText не сразу закрывает файл. StreamWriter решает мою проблему. Спасибо. Кстати, мне просто интересно, есть ли способ дождаться выпуска файла или какого-либо события, такого как filerelease_completed?   -  person cihadakt    schedule 05.12.2013
comment
Рад слышать, что StreamWriter добился своего. Я не уверен, как можно было бы следить за выпуском, кроме как просто проверить его.   -  person Matt J.    schedule 06.12.2013


Ответы (1)


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

// Attach the message string to this e-mail message.
Attachment data = new Attachment(textMessage, MediaTypeNames.Text.Plain);
data.Name = "test.csv";

Найдено здесь: http://msdn.microsoft.com/ru-ru/library/9089e309(v=vs.110).aspx Или попробуйте этот метод: http://msdn.microsoft.com/ru-ru/library/ms144617(v=vs.110).aspx

person Tony    schedule 05.12.2013