2012-04-20 5 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

+0

자, 자. 나는 오늘 밤에 더 완벽한 대답을 생각할 수 없다. 너무 늦었다. 그것이 도움이된다면 받아 들여지는 대답을하는 것이 좋은 생각입니다 -> 그것은 당신의 속도를 향상시키고 더 많은 사람들이 (아마도 나보다 나은) 대답 할 의향이있을 것입니다 : –

답변

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 루프를 사용하는 것을 생각해 봤지만 루프를 넣을 위치를 모른다. 나는 여전히 프로그래밍에 익숙하지 않기 때문에 배울 점이 많다. :). 두 가지 방법 모두 시도했지만 첫 번째 방법 만 사용합니다. 두 번째 (사전) 솔루션이 나를 위해 작동하지 않습니다. 내가 실수를했는지 또는 무엇을했는지 나는 모른다. 사전은 값을 반환하지 않습니다. –

+0

사전의 경우 파일의 모든 항목을 사전으로 바꿉니다. 오 잘. 앞으로 프로그래밍을 배우고 싶다면 C (포인터 이해 용)와 Common Lisp (당신에게 좋음)을 사용해 보시길 권합니다. –

+0

C 및 공통 리스프가 이해되었습니다. 나는 그것을 들여다 볼 것이다. 나는 여전히 초보자이므로 배울 것이 많다. 다시 한번 감사드립니다 @Shingetsu! :) –

관련 문제