A operação excedeu o tempo limite enviando email com ficheiro zip

  • Thread starter Thread starter helder227
  • Start date Start date
H

helder227

Guest
I'm developing an application to apply web cameras for forest and forest monitoring. This application saves photo frames and then we can make a video of these photo frames but I will explain: The application when we load the green button it starts to take photo frames, after having executed them and load in the red box to stop the software to take photo frames, then it does a zip file of those photo frames and I need to send them by email and then delete all of the respective folder. Well my problem is not in the software itself everything is working fine, but the problem starts when the software before deleting everything I want to send the zip file to the email but of course these files are wider than allowed. So give me an exception 'The operation has exceeded the time limit' I tried in several ways, but with no success. I wanted to know if there is any way to overcome this problem.

This is my code in question:


Imports System.IO
Imports System.Net.Mail

Imports System.IO.Compression
Imports System.Xml

Public Class Form2
Dim mydataandtimeforsave As String = DateTime.Now.ToString("yyyyMMddHHmmss")
Dim frame As Long 'individual frames
Dim tempdir As String = "C:\dirorg/" ' images temp directory
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
If TextBox1.Text = "" Then
TextBox1.Text = 1
End If

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

capturex()
'save()
End Sub
Public Sub capturex()
Try

Dim area As Rectangle
Dim graph As Graphics
Dim captured As Bitmap
area = Screen.PrimaryScreen.Bounds
captured = New System.Drawing.Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
graph = Graphics.FromImage(captured)

graph.CopyFromScreen(area.X, area.Y, 0, 0, area.Size, CopyPixelOperation.SourceCopy)
' you will need IF statement if you have checkbox
If CheckBox1.Checked = True Then
Cursor.Draw(graph, New Rectangle(New Point(Cursor.Position.X - Cursor.HotSpot.X, Cursor.Position.Y - Cursor.HotSpot.Y), Cursor.Size))

End If
Dim strings As String

strings = frame
captured.Save(tempdir & "\" & strings & ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
frame += 1
Label2.Text = "TIME: " & frame
Catch ex As Exception

End Try
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Timer1.Start()
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

Me.Timer1.Interval = TimeSpan.FromSeconds(TextBox1.Text).TotalMilliseconds
capturex()

End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
renameFilesInFolder()


'-framerate 3 -i "Imgp%%04d.jpg" -s 720x480 test.avi)
End Sub
Private Sub renameFilesInFolder()
Dim sourcePath As String = "C:\dirorg/"
Dim searchPattern As String = "*.jpg"
Dim i As Integer = 0
For Each fileName As String In Directory.GetFiles(sourcePath, searchPattern, SearchOption.AllDirectories)
File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, "Imgp" & i & "d.jpg"))
i += 1
Next
End Sub

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
With SaveFileDialog1
.DefaultExt = ".avi"
.FilterIndex = 1
.Filter = "Avi Files (*.avi)|*.avi|All files (*.*)|*.*"
End With
SaveFileDialog1.ShowDialog()
End Sub

Private Sub SaveFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk

Dim args As String 'declare args
args = "-r 1/.1 -i " & "C:\dirorg" & "\%01d.jpg -c:v libx264 -r 80 -pix_fmt yuv420p " & Chr(34) & SaveFileDialog1.FileName & Chr(34) 'set ffmpeg arguments
Dim proc As New Process
Dim proci As New ProcessStartInfo
proci.FileName = "C:\dirorg\ffmpeg.exe"
proci.Arguments = args
proci.WindowStyle = ProcessWindowStyle.Hidden
proci.CreateNoWindow = True
proci.UseShellExecute = False
proc.StartInfo = proci
proc.Start()
Do Until proc.HasExited = True
Me.Text = "Saving"
Loop
Me.Text = "your video done"

MsgBox("Done")
compimages()
BackgroundWorker1.RunWorkerAsync()
MsgBox("All Done")
Dim directoryName As String = tempdir

For Each deleteFile In Directory.GetFiles(directoryName, "*.jpg", SearchOption.TopDirectoryOnly)
File.Delete(deleteFile)
Next
End Sub

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Timer1.Stop()
End Sub

Public Sub compimages()
'To zip a directory
Dim mydataandtimeforsave = DateTime.Now.ToString("yyyyMMddHHmmss")
Dim Compressed = ZipDirectory("C:\dirorg")
File.WriteAllBytes("C:\dirorg\images.zip", Compressed)
End Sub
Public Sub uncompimages()
'To unzip a zipped file
Dim Compressed = File.ReadAllBytes("C:\dirorg\images" & mydataandtimeforsave & ".zip")
UnzipDirectory(Compressed, "C:\dirorg")
End Sub
Public Function ZipDirectory(DirPath As String) As Byte()
If Not Directory.Exists(DirPath) Then Return Nothing

Dim Directories = Directory.GetDirectories(DirPath, "*", SearchOption.AllDirectories)
Dim Files = Directory.GetFiles(DirPath, "*", SearchOption.AllDirectories)

Dim X As New XmlDocument
Dim RootNode = X.CreateElement("Content")
Dim DirsNode = X.CreateElement("Directories")
Dim FilesNode = X.CreateElement("Directories")

X.AppendChild(RootNode)
RootNode.AppendChild(DirsNode)
RootNode.AppendChild(FilesNode)

For Each d In Directories
Dim DirNode = X.CreateElement("Directory")
Dim PathAttrib = X.CreateAttribute("Path")
PathAttrib.Value = d.Replace(DirPath & "\", "") 'Create relative paths
DirNode.Attributes.Append(PathAttrib)
DirsNode.AppendChild(DirNode)
Next

For Each f In Files
Dim FileNode = X.CreateElement("File")
Dim PathAttrib = X.CreateAttribute("Path")
PathAttrib.Value = f.Replace(DirPath & "\", "") 'Create relative paths
FileNode.Attributes.Append(PathAttrib)
FileNode.InnerText = Convert.ToBase64String(File.ReadAllBytes(f))
FilesNode.AppendChild(FileNode)
Next

Using Mem As New MemoryStream()
X.Save(Mem)
Dim AllContentsAsByteArray = Mem.ToArray()
Dim CompressedContent = CompressArray(AllContentsAsByteArray)
Return CompressedContent
End Using
End Function

Public Sub UnzipDirectory(compressed() As Byte, outputPath As String)
If Not Directory.Exists(outputPath) Then Directory.CreateDirectory(outputPath)

Dim Uncompressed = DecompressArray(compressed)

Dim X As New XmlDocument

Using Mem As New MemoryStream(Uncompressed)
X.Load(Mem)

Dim RootNode = X.FirstChild
Dim DirsNode = RootNode.FirstChild
Dim FilesNode = RootNode.FirstChild.NextSibling

For Each ChildDir In DirsNode.ChildNodes
Directory.CreateDirectory(Path.Combine(outputPath, DirectCast(ChildDir, XmlNode).Attributes.Item(0).Value))
Next

For Each ChildFile In FilesNode.ChildNodes
Dim FilePath = Path.Combine(outputPath, DirectCast(ChildFile, XmlNode).Attributes.Item(0).Value)
Dim Content = Convert.FromBase64String(DirectCast(ChildFile, XmlNode).InnerText)
File.WriteAllBytes(FilePath, Content)
Next
End Using
End Sub

Private Function CompressArray(ByVal content() As Byte) As Byte()
Using outFile As New MemoryStream()
Using Compress As New GZipStream(outFile, CompressionMode.Compress)
Compress.Write(content, 0, content.Length)
End Using

Return outFile.ToArray()
End Using
End Function

Private Function DecompressArray(ByVal content() As Byte) As Byte()
Using outFile As New MemoryStream()
Using inFile As New MemoryStream(content)
Using Compress As New GZipStream(inFile, CompressionMode.Decompress)
Dim buffer(1023) As Byte
Dim nRead As Integer
Do
nRead = Compress.Read(buffer, 0, buffer.Length)
outFile.Write(buffer, 0, nRead)
Loop While nRead > 0
End Using
End Using

Return outFile.ToArray()
End Using
End Function
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Using mail As New MailMessage
mail.From = New MailAddress("helderventura227@gmail.com")
mail.To.Add(My.Settings.destinationx$)
mail.Body = My.Settings.bodyx$

Dim attach As New Attachment("C:\dirorg\images.zip")
mail.Attachments.Add(attach)

mail.Subject = My.Settings.subjectx$
mail.Priority = MailPriority.High
Using SMTP As New SmtpClient

SMTP.EnableSsl = True
SMTP.Port = "587"
SMTP.Host = "smtp.gmail.com"
SMTP.Credentials = New Net.NetworkCredential("helderventura227@gmail.com", "u>#4TBOw")
SMTP.Send(mail)
End Using
End Using

End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
MsgBox("Email has been sent successfully!", MsgBoxStyle.Information)
End Sub
End Class

Continue reading...
 
Back
Top