2012-04-20 114 views
0

我在这里有一个小问题。我有一个应用程序通过电子邮件发送一个文件列表名称,通知用户这些文件已超过一定的大小限制。但现在我希望它不仅发送文件名称,而且还发送文件大小。我设法将文件大小附加到电子邮件。但我的问题是它展示的方式。我希望它显示如下:通过电子邮件并排发送两个列表?

THE FILES : 

filename1 = filesize1 
filename2 = filesize2 
filename3 = filesize3 
.. 
.. 
.. 

HAS REACHED ITS LIMITS! 

但在电子邮件我目前的显示格式是这样的:

THE FILES : 

filename1 
filename2 
filename3 
filesize1 
filesize2 
filesize3 

HAS REACHED ITS LIMITS! 

现在我不知道如何来改变显示格式,如第一个。任何帮助将不胜感激。 这里是我的代码片段:

private void Form1_Load(object sender, EventArgs e) 
    { 
     count = 0; 
     timer = new Timer(); 
     timer.Interval = 1000; 
     timer.Tick += new EventHandler(timer1_Tick); 
     timer.Start(); 
     System.Collections.Generic.List<string> files = new List<string>(); 
     System.Collections.Generic.List<string> files1 = new List<string>(); 
     //List<string> s1 = System.IO.Directory.GetFiles(@"C:\Documents and Settings\Administrator\Desktop\test", "*.*", SearchOption.AllDirectories).ToList<string>(); 
     List<string> s1 = System.IO.Directory.GetFiles(@"F:\gdimaging\data", "*.*", SearchOption.AllDirectories).ToList<string>(); 
     s1.AddRange(System.IO.Directory.GetFiles(@"F:\hios\DATA", "*.*", SearchOption.AllDirectories).ToList<string>()); 
     s1.AddRange(System.IO.Directory.GetFiles(@"F:\imgviewer\data", "*.*", SearchOption.AllDirectories).ToList<string>()); 
     s1.AddRange(System.IO.Directory.GetFiles(@"F:\newcnas\data", "*.*", SearchOption.AllDirectories).ToList<string>()); 
     s1.AddRange(System.IO.Directory.GetFiles(@"F:\newpod\data", "*.*", SearchOption.AllDirectories).ToList<string>()); 
     s1.AddRange(System.IO.Directory.GetFiles(@"F:\OMS\data", "*.*", SearchOption.AllDirectories).ToList<string>()); 
     s1.AddRange(System.IO.Directory.GetFiles(@"F:\WEBIMG", "*.*", SearchOption.AllDirectories).ToList<string>()); 

     dt.Columns.Add("File_Name"); 
     dt.Columns.Add("File_Type"); 
     dt.Columns.Add("File_Size"); 
     dt.Columns.Add("Create_Date"); 

     foreach (string s in s1) 
     { 
      try 
      { 
       FileInfo info = new FileInfo(s); 
       FileSystemInfo sysInfo = new FileInfo(s); 
       dr = dt.NewRow(); 
       dr["File_Name"] = sysInfo.Name; 
       dr["File_Type"] = sysInfo.Extension; 
       dr["File_Size"] = (info.Length/1024).ToString(); 
       dr["Create_Date"] = sysInfo.CreationTime.Date.ToString("dd/MM/yyyy"); 
       dt.Rows.Add(dr); 


       if ((info.Length/1024) > 1500000) 
       { 
        MyFiles = new Dictionary<string, string>(); 
        //files.Add(sysInfo.Name.ToString()); 
        //files1.Add(info.Length.ToString()); 
        //arr = string.Join("<br/>", files.ToArray()); 
        //arr1 = string.Join("<br/>", files1.ToArray()); 
        MyFiles.Add(sysInfo.Name.ToString(), info.Length.ToString()); 
       } 

       if (dt.Rows.Count > 0) 
       { 
        dataGridView1.DataSource = dt; 
       } 
      } 
      catch (UnauthorizedAccessException ex) 
      { 
       MessageBox.Show("Error : " + ex.Message); 
       continue; 
      } 
     } 

     if (arr != null) 
     { 
      ///Basic Email message 
      MailMessage mailMessage = new MailMessage(); 
      // Email to send to 
      mailMessage.To.Add(new MailAddress("[email protected]")); 
      mailMessage.To.Add(new MailAddress("[email protected]")); 
      //set subject 
      mailMessage.Subject = "FILE SIZE WARNING MESSAGE"; 
      //set body 
      //mailMessage.Body = "THE FILES : <br/><br/>" + arr + arr1 + "<br/><br/> HAS REACH ITS SIZE LIMIT!!"; 
      mailMessage.Body = "THE FILES : <br/><br/>"; 
      foreach (string key in MyFiles.Keys) 
      { 
       mailMessage.Body += key + " = " + MyFiles[key] + "<br/>"; 
       mailMessage.Body += "<br/> HAS REACHED ITS SIZE LIMIT!"; 
      } 
      mailMessage.IsBodyHtml = true; 
      mailMessage.From = new MailAddress("************", "Shahrul Nizam"); 
      //Identify the credentials to login to the gmail account 
      string sendEmailsFrom = "**********"; 
      string sendEmailsFromPassword = "**********"; 
      NetworkCredential cred = new NetworkCredential(sendEmailsFrom, sendEmailsFromPassword); 
      SmtpClient mailClient = new SmtpClient("smtp.gmail.com", 587); 
      mailClient.EnableSsl = true; 
      mailClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
      mailClient.UseDefaultCredentials = false; 
      //mailClient.Timeout = 20000; 
      mailClient.UseDefaultCredentials = true; 
      mailClient.Credentials = cred; 
      mailClient.Send(mailMessage); 
      //MessageBox.Show("Email Notification Sent!"); 
      //MessageBox.Show(fileList.ToString() + "overlimit!!"); 
     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
      count++; 
      if (count == 600) 
      { 
       count = 0; 
       timer.Stop(); 
       Application.Restart(); 
      } 
    } 
+0

你目前如何生成太大的文件列表? – sarnold 2012-04-20 02:30:52

+0

你走了。今晚我想不出更完整的答案,为时已晚。请注意,如果有帮助,给予接受的答案是一个好主意 - >它会提高你的速度,而更多的人(很可能比我更好)会倾向于回答:) – 2012-04-20 02:51:09

回答

1

更改此:

/*step 1*/if ((info.Length/1024) > 1500000) 
       {//my size checking and storing it in an array 
        files.Add(sysInfo.Name.ToString()); 
        files1.Add(info.Length.ToString()); 
        arr = string.Join("<br/>", files.ToArray()); 
        arr1 = string.Join("<br/>", files1.ToArray()); 
       } 
/*step 2*/mailMessage.Body = "THE FILES : <br/><br/>" + arr + arr1 + "<br/><br/> HAS REACH ITS SIZE LIMIT!!"; 

/*step 1*/if ((info.Length/1024) > 1500000) 
       {//my size checking and storing it in an array 
        files.Add(sysInfo.Name.ToString()); 
        files1.Add(info.Length.ToString()); 
       } 
/*step2*/mailMessage.Body = "THE FILES : <br/><br/>"; 
for(int i=0; i<files.Count; i++) 
    mailMessage.Body += files[i] + " = " + files1[i] + "<br/>; 
mailMessage.Body += "<br/> HAS REACHED ITS SIZE LIMIT!!"; 

在列表的最后一个实例额外<br/>都不会有问题,因为最后几行从2个休息开始(我删除了一个)。

的的假定我做:

  • 名单大小相同
  • 各指标在一个,对应于其他项目。

可以这样做与(类型)的字典更好,像这样:

/*step 1*/if ((info.Length/1024) > 1500000) 
       {//my size checking and storing it in an array 
        /* I suppose there is a Dictionary<string, string> MyFiles; 
        MyFiles = new Dictionary<string,string>(); instantiated like so*/ 
        MyFiles.add(sysInfo.Name.ToString(), info.Length.ToString()); 
       } 
       //attaching the array to the email body 
        /*step 2*/mailMessage.Body = "THE FILES : <br/><br/>"; 
        foreach(string key in MyFiles.Keys) 
         mailMessage.Body += key + " = " + MyFiles[key] + "<br/>"; 
        mailMessage.Body += "<br/> HAVE REACHED THEIR SIZE LIMIT!!"; 

注意,通过更好地我意味着更多的内存使用效率。更好的意思是不太容易出错。从技术上讲,你有一个键值对。这是一本字典。

+0

非常感谢@shingetsu!我想过使用for循环,但我不知道在哪里放置循环。我仍然是编程新手,所以仍然需要学习很多:)。我已经尝试了你的两个解决方案,但只有第一个可行。第二个(字典)解决方案不适合我。我不知道我是否犯了什么错误或什么。字典不会返回任何值。 – 2012-04-20 03:19:19

+0

对于字典,用字典替换文件的所有出现。好吧。如果你想学习未来的编程,我建议你尝试C(用于指针理解)和Common Lisp(对你有好处) – 2012-04-20 10:43:20

+0

C和common lisp ??理解。我会研究它。我仍然有很多东西需要学习,因为我还是个新手。再次感谢@Shingetsu!:) – 2012-04-23 00:44:53