繁体   English   中英

尝试删除文件C#时出现错误“正在使用文件”

[英]Getting Error 'File is being used' when trying to delete file c#

我有Windows服务,该服务会定期从表中获取数据并创建excel文件并将其邮寄给用户。邮件发送后,我需要删除该文件。 使用了以下代码:

public void LABInstrumentExcelGeneration(string filePath) {
    try {
        string connectionString = GetConnectionString(filePath);

        List < LABInstruments > listLABInstrument = null;
        listLABInstrument = new List < LABInstruments > ();
        listLABInstrument = LABInstrumentBL.GetLABInstrumentList();
        if (listLABInstrument.Count > 0) {
            using(OleDbConnection conn = new OleDbConnection(connectionString)) {
                conn.Open();
                OleDbCommand cmd = new OleDbCommand();
                cmd.Connection = conn;

                cmd.CommandText = "CREATE TABLE [table2] (SrNo string,CalibrationDoneOn Date);";
                cmd.ExecuteNonQuery();

                foreach(LABInstruments tc1 in listLABInstrument) {
                    cmd.CommandText = "INSERT INTO [table2](SrNo,CalibrationDoneOn) VALUES('" + tc1.SrNo + "','" + tc1.CalibrationDoneOn + "');";
                    cmd.ExecuteNonQuery();

                }
                conn.Close();
                conn.Dispose();
            }
        }
    } catch (Exception ex) {}
 }

 SendMail(filePath, role);

 if (File.Exists(filePath)) {
    File.Delete(filePath);
    eLog.WriteEntry("file deleted");
 }

但是它给出了错误文件正在被另一个进程使用。 我可以删除文件吗? 此外,我已经使用OLEDB进行文件创建。 文件创建还有其他最佳做法吗? 尝试过ExcelLibrary,但是在其中创建的文件在所有版本的Office中均不起作用,因此将其删除。

尝试这个:

protected virtual bool IsLocked(FileInfo fileName)
{
   FileStream fStream = null;
   try
   {
        fStream = fileName.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
   }
   catch (IOException)
   {
        return true;
   }
   finally
   {
        if (fStream != null)
        {
             fStream.Close();
        }
   }
   return false;
}

接着:

if (File.Exists(filePath))
{
    FileInfo myfile = new FileInfo(filePath);
    if(IsLocked(myfile))
    {
        File.Create(filePath).Close();
        File.Delete(filePath);
        eLog.WriteEntry("file deleted");
    }
    else
    {
        File.Delete(filePath);
        eLog.WriteEntry("file deleted");
    }
}

我认为问题可能是sendmail在使用完文件之前返回的。

我使用的不是函数sendmail(),而是释放了要删除的文件:

    public static void send(string subject, string body, string from, string to, List<string> attachments = null)
    {
        using (MailMessage message = new MailMessage(new MailAddress(from), new MailAddress(to)))
        {
            message.Subject = subject;
            message.Body = body;
            if (attachments != null && attachments.Count > 0)
            {
                foreach (string s in attachments)
                {                        
                    if (s != null)
                    {
                        /* this code fixes the error where the attached file is 
                         * prepended with the path of the file */
                        Attachment attachment = new Attachment(s, MediaTypeNames.Application.Octet);
                        ContentDisposition disposition = attachment.ContentDisposition;
                        disposition.CreationDate = File.GetCreationTime(s);
                        disposition.ModificationDate = File.GetLastWriteTime(s);
                        disposition.ReadDate = File.GetLastAccessTime(s);
                        disposition.FileName = Path.GetFileName(s);
                        disposition.Size = new FileInfo(s).Length;
                        disposition.DispositionType = DispositionTypeNames.Attachment;
                        message.Attachments.Add(attachment);
                    }
                }
            }
            using (SmtpClient client = new SmtpClient())
            {
                client.Send(message);
            }
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM