2013-11-08 3 views
1

У меня есть небольшая электронная почта, которая выполняет шифрование. Ниже приводится только краткое изложение программы:C# File.Delete - Файл используется другим процессом

private void sendEmailButton_Click(object sender, EventArgs e) 
{ 
    else 
    {  
     ////////////////////////////////////////////////////////////////////////// 
     if (encryptEverythingCheckBox.Checked) 
     { 
      encryptAll(); 
     } 
     ////////////////////////////////////////////////////////////////////////// 

     // Email credentials network codes blahblah 
     // Assign the sender's email address to MailAddress function 
     MailAddress mailAddress = new MailAddress(username); 
     // Tells the recipent the sender's email 
     mailMessage.From = mailAddress; 
     // Username & Password of your email address 
     System.Net.NetworkCredential networkCredential; 
     networkCredential = new System.Net.NetworkCredential(username, password); 
     // Enable SSL to encypt the connection 
     smtpClient.EnableSsl = true; 
     // Disable the use of default credentials 
     smtpClient.UseDefaultCredentials = false; 
     // Specify your own credential 
     smtpClient.Credentials = networkCredential; 
     //port number and send email blahblahblah 
     deleteEncryptedFile(); 
    } 
} 

Так что проблема у меня сейчас в отношении метода пустот deleteEncryptedFile() и encryptAll(). Ниже приведены коды:

public void deleteEncryptedFile() 
{ 
    if (File.Exists(@"C:\EncryptedFile.pgp"))    
     File.Delete(@"C:\EncryptedFile.pgp");    
} 

public void encryptAll() 
{ 
    OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
    openFileDialog1.InitialDirectory = "c:\\"; 
    openFileDialog1.RestoreDirectory = true; 
    openFileDialog1.Title = "CHOOSE RECIPENT'S PUBLIC KEY"; 

    if (openFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
     invisibleTextBox.Text = openFileDialog1.FileName.ToString(); 
     string encryptedbodymessage = pgp.EncryptString(messageRichTextBox.Text, new FileInfo(@invisibleTextBox.Text)); 
     messageRichTextBox.Text = ""; 
     messageRichTextBox.Text = encryptedbodymessage; 

     if (attachmentTextBox.Text != "") 
     { 
      bool asciiArmor = false; 
      bool withIntegrityCheck = false; 
      pgp.EncryptFile(@attachmentTextBox.Text, @invisibleTextBox.Text, @"C:\EncryptedFile.pgp", asciiArmor, withIntegrityCheck); 
      invisibleTextBox.Text = ""; 
      mailAttachment = new Attachment(@"C:\EncryptedFile.pgp"); 
     } 
    } 
} 

Так когда кнопка посыла щелкнул и файлы зашифрованы и отправлены, я хочу, чтобы удалить его с компьютера. Поэтому я запустил метод deleteEncryptedFile, чтобы удалить EncryptedFile.pgp с моего компьютера. Но я продолжал получать это сообщение, которое говорит:

«Процесс не может получить доступ к файлу« C: \ EncryptedFile.pgp », потому что он используется другим процессом».

Но единственный «другой процесс», о котором я могу думать, - это метод шифрования (encryptAll()). Но разве это не должно было быть сделано? Пожалуйста, совет, как я могу решить эту проблему?

+0

Возможно, вы забыли закрыть мероприятие, но не можете прочитать его из своего кода. –

+1

Неправильная практика размещения файлов в корневой папке. – Ofiris

+2

Моя догадка гласит, что либо 'pgp.EncryptFile', либо' new Attachment' имеет дескриптор открытого файла в вашем зашифрованном файле. – Kabbalah

ответ

7

Попробуйте удалить почтовое приложение перед удалением.

mailAttachment.Dispose(); 
+0

В случае, если вы находитесь используя message.Attachments.Add (новое вложение (имя файла)), тогда вы будете использовать message.Attachments.Dispose(); – KFP

-3

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

public static bool IsFileLocked(string fileName) 
     { 
      FileStream stream = null; 
      try 
      { 
       stream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
      } 
      catch (IOException) 
      { 
       return true; 
      } 
      finally 
      { 
       if (stream != null) 
        stream.Close(); 
      } 
      return false; 
     } 
+2

Вы лечите симптомы этим, а не причиной. – CodeCaster

+0

Немного слишком для меня. Я знаю, что он делает в основном, но я не знаю, как подать заявку на мой проект. Можно просто убить процесс и удалить файл? – user2930173

+0

Вы пытались удалить файл через некоторое время. Я думаю, когда вы вызываете функцию. Файл все еще используется. Вот я хотел бы знать, какая именно причина – MaheshMajeti

Смежные вопросы