472,353 Members | 2,057 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,353 software developers and data experts.

File monitor/copy code doesn't catch everything

All,
This is sort of a continuation of a previous post of mine. The code below
basically reads a registry key to get a path to a folder and it watches for
files created in that folder (only created). It also reads another registry
key for another path which is a destination path. When a file shows up, it
copies it off.

It actually works well . . . For small duty stuff but if for example I were
to copy in multiple small files simulteneously into the source folder, it
only copies the first one it sees. It sorta peeters out after that, and I
don't think it continues on copying.

Also, if I drop a large file -- 500MB or higher -- into the folder, it
starts copying, but if I drop another file in the folder during this time,
it doesn't pick it up. I don't think it even finished copying the large
file.

Just wanted to see if y'all could give me some direction/advice.

TIA,
Pair

Imports System.ServiceProcess

Imports System.Threading

Public Class Service1

Inherits System.ServiceProcess.ServiceBase

Dim DestDirectory As String

Dim WatchDirectory As String

Private Watchservice As New Thread(New
System.Threading.ThreadStart(AddressOf StartMonitor))

#Region " Component Designer generated code "

Public Sub New()

MyBase.New()

' This call is required by the Component Designer.

InitializeComponent()

' Add any initialization after the InitializeComponent() call

End Sub

'UserService overrides dispose to clean up the component list.

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

If Not (components Is Nothing) Then

components.Dispose()

End If

End If

MyBase.Dispose(disposing)

End Sub

' The main entry point for the process

<MTAThread()_

Shared Sub Main()

Dim ServicesToRun() As System.ServiceProcess.ServiceBase

' More than one NT Service may run within the same process. To add

' another service to this process, change the following line to

' create a second service object. For example,

'

' ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1,
New MySecondUserService}

'

ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service1}

System.ServiceProcess.ServiceBase.Run(ServicesToRu n)

End Sub

'Required by the Component Designer

Private components As System.ComponentModel.IContainer

' NOTE: The following procedure is required by the Component Designer

' It can be modified using the Component Designer.

' Do not modify it using the code editor.

<System.Diagnostics.DebuggerStepThrough()Private Sub InitializeComponent()

components = New System.ComponentModel.Container()

Me.ServiceName = "Service1"

End Sub

#End Region

Protected Overrides Sub OnStart(ByVal args() As String)

' Start the thread.

Watchservice.Start()

End Sub

Protected Overrides Sub OnStop()

' Add code here to perform any tear-down necessary to stop your service.

Watchservice.Abort()

End Sub

Private Sub StartMonitor()

Do

WatchDirectory =
My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\ Software\CopyMon",
"Source", Nothing)

DestDirectory =
My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\ Software\CopyMon",
"Destination", Nothing)

Dim watcher As New System.IO.FileSystemWatcher(WatchDirectory)

Dim result

AddHandler watcher.Created, AddressOf logchange

'Dim SourceFileNameObject As IO.WaitForChangedResult

'Dim SourceFileName As String

'SourceFileName = SourceFileNameObject.Name

'MsgBox(SourceFileName)

result = watcher.WaitForChanged(System.IO.WatcherChangeType s.Created)

Loop

End Sub

Private Sub logchange(ByVal source As Object, ByVal e As
System.IO.FileSystemEventArgs)

Dim SourceFilePath As String

Dim SourceFileName As String

Dim DestPath As String

If e.ChangeType = IO.WatcherChangeTypes.Created Then

SourceFilePath = e.FullPath

SourceFileName = e.Name

'MsgBox(SourceFilePath)

'MsgBox(DestDirectory & "\" & SourceFileName)

DestPath = DestDirectory & "\" & SourceFileName

My.Computer.FileSystem.CopyFile(SourceFilePath, DestPath)

End If

End Sub

End Class
Mar 23 '07 #1
2 2707
On Mar 23, 3:39 pm, "TwistedPair" <twistedp...@mail.comwrote:
All,
This is sort of a continuation of a previous post of mine. The code below
basically reads a registry key to get a path to a folder and it watches for
files created in that folder (only created). It also reads another registry
key for another path which is a destination path. When a file shows up, it
copies it off.

It actually works well . . . For small duty stuff but if for example I were
to copy in multiple small files simulteneously into the source folder, it
only copies the first one it sees. It sorta peeters out after that, and I
don't think it continues on copying.
What you see as 'simultaneous' copying of several files, to the
computer is probably not simultaneous at all. It probably sees the
creation of the first file and then kicks off it's processing, not
getting an event for the other files. One possible way of getting
around this is when you see the create event, get a list of ALL files
that match your criteria and then copy them all.
>
Also, if I drop a large file -- 500MB or higher -- into the folder, it
starts copying, but if I drop another file in the folder during this time,
it doesn't pick it up. I don't think it even finished copying the large
file.
Same as above, once the 500Mb file appears, the file system watcher
fires the created event and your code launches into the long process
of copying the file. Other files copied after that, don't get
events.

One method would be to simply have your FileSystemWatcher add the
filename to a queue or list and then go back to watching for files.
The copying process could be kicked off using a background thread
which continually monitors the queue and if a filename is found there,
copies it. So you would have two separate processes. One which uses
the FileSystemWatcher to monitor for files and insert their names into
a queue and another to watch the queue and do the actual copying.

Hopefully this will give you some ideas.

Chris

Mar 23 '07 #2
Yes it does! I was wondering if that was indeed the best way to handle it,
and now I suppose I have confirmation. Now all I have to do is figure out
how. Thank you for your pointers, and any others would be greatly
appreciated as well!

"Chris Dunaway" <du******@gmail.comwrote in message
news:11*********************@y66g2000hsf.googlegro ups.com...
On Mar 23, 3:39 pm, "TwistedPair" <twistedp...@mail.comwrote:
>All,
This is sort of a continuation of a previous post of mine. The code
below
basically reads a registry key to get a path to a folder and it watches
for
files created in that folder (only created). It also reads another
registry
key for another path which is a destination path. When a file shows up,
it
copies it off.

It actually works well . . . For small duty stuff but if for example I
were
to copy in multiple small files simulteneously into the source folder, it
only copies the first one it sees. It sorta peeters out after that, and
I
don't think it continues on copying.

What you see as 'simultaneous' copying of several files, to the
computer is probably not simultaneous at all. It probably sees the
creation of the first file and then kicks off it's processing, not
getting an event for the other files. One possible way of getting
around this is when you see the create event, get a list of ALL files
that match your criteria and then copy them all.
>>
Also, if I drop a large file -- 500MB or higher -- into the folder, it
starts copying, but if I drop another file in the folder during this
time,
it doesn't pick it up. I don't think it even finished copying the large
file.

Same as above, once the 500Mb file appears, the file system watcher
fires the created event and your code launches into the long process
of copying the file. Other files copied after that, don't get
events.

One method would be to simply have your FileSystemWatcher add the
filename to a queue or list and then go back to watching for files.
The copying process could be kicked off using a background thread
which continually monitors the queue and if a filename is found there,
copies it. So you would have two separate processes. One which uses
the FileSystemWatcher to monitor for files and insert their names into
a queue and another to watch the queue and do the actual copying.

Hopefully this will give you some ideas.

Chris

Mar 24 '07 #3

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

9
by: Hans-Joachim Widmaier | last post by:
Hi all. Handling files is an extremely frequent task in programming, so most programming languages have an abstraction of the basic files offered...
5
by: matt dittman | last post by:
I have created a windows service that reads emails from a drop directory and moves them to the appropriate mail folder every 15 seconds. I can...
9
by: Paul | last post by:
Hi, VB.NET is saying the file I am creating is in use by another process and won't complete its task of moving the file to the specified...
4
by: Shannon Hardin | last post by:
I'm trying to build a routine that will take a specified file from the user's local hard drive, and copy it to a remote server via WebDAV. I've...
8
by: Sarah | last post by:
I need to access some data on a server. I can access it directly using UNC (i.e. \\ComputerName\ShareName\Path\FileName) or using a mapped network...
6
by: Clark Sann | last post by:
Can someone help me understand what object should be used as the lock object? I've seen some programs that use Monitor.Enter(Me). Then, in those...
17
by: spentun | last post by:
How can I moitor file which is executed by user or program in window. I need to write a code to monitor file. When user clicks the file(.exe) or is...
8
by: Philip Wagenaar | last post by:
I need to send printjobs to a printqueue under diffrent usernames. The printsoftware on the queue is not very 'secure' so I can create a user on 1...
1
by: Dan | last post by:
I have an application that I want to use for copying files. My goal is to copy a files, if a file is in use or not accessible because of security...
1
by: Kemmylinns12 | last post by:
Blockchain technology has emerged as a transformative force in the business world, offering unprecedented opportunities for innovation and...
0
jalbright99669
by: jalbright99669 | last post by:
Am having a bit of a time with URL Rewrite. I need to incorporate http to https redirect with a reverse proxy. I have the URL Rewrite rules made...
0
by: antdb | last post by:
Ⅰ. Advantage of AntDB: hyper-convergence + streaming processing engine In the overall architecture, a new "hyper-convergence" concept was...
2
by: Matthew3360 | last post by:
Hi, I have a python app that i want to be able to get variables from a php page on my webserver. My python app is on my computer. How would I make it...
0
by: AndyPSV | last post by:
HOW CAN I CREATE AN AI with an .executable file that would suck all files in the folder and on my computerHOW CAN I CREATE AN AI with an .executable...
0
hi
by: WisdomUfot | last post by:
It's an interesting question you've got about how Gmail hides the HTTP referrer when a link in an email is clicked. While I don't have the specific...
0
by: Matthew3360 | last post by:
Hi, I have been trying to connect to a local host using php curl. But I am finding it hard to do this. I am doing the curl get request from my web...
0
Oralloy
by: Oralloy | last post by:
Hello Folks, I am trying to hook up a CPU which I designed using SystemC to I/O pins on an FPGA. My problem (spelled failure) is with the...
0
by: Carina712 | last post by:
Setting background colors for Excel documents can help to improve the visual appeal of the document and make it easier to read and understand....

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.