How to remotely instruct a Server to do a file copy operation (and hopefully track progress)


We currently have a desktop application that I will be rewriting shortly.  One of its functions is to make a backup of a large file.  At the moment it simply does something like;  
file.copy(\\MyServer\MyFiles\myfile.txt, \\MyServer\MyBackups\[today.toString]\myfile.txt)

Open in new window


But I reckon there must be a better way of doing this.  I was thinking that there could be a service of some sort running on the server, that receives a notification to run a copy operation.

I started looking at WCF but have no experience, and I couldn't find much help in providing progress.  There are plenty of examples of progress when uploading from client to server.  But I couldn't find anything about providing progress to the client when the operation is completely on the server-side.

any thoughts/suggestions?

Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Bill BachPresident and Btrieve GuruCommented:
I am not aware of a pre-built service to schedule copy operations remotely -- as I believe that this would be a HUGE security hole waiting to be exploited if it were really a general-purpose tool.  I would therefore provide two possible suggestions:

1) If your backup can be run at a specific time via a Scheduled Task, then I would recommend going that route.  Every night, my server handles a bunch of file-copy operations to backup NAS devices and workstations, but these scripts all fire at the same time every night.
2) If you need to be able to flag the start time of the backup, then you'll need to write a simple program (VBScript or batch files would be easiest).  The easiest solution is to monitor a specific directory, looking for a specific file, such as GO.TXT.  If the file is not there, sleep for 30 seconds and check again.  When the file appears, read it to acquire the filename to copy and continue with the copy operation.  (You could make this even simpler by using GO.BAT and then simply call the batch file.)  After the file copy is done, delete the file.  If you need confirmation, you can create a DONE.TXT file in the same folder, and the client can monitor the folder for when it finishes (and delete the DONE.TXT file as an acknowledgement).
3) Of course, if you truly want a generic remote file copy service, it would be possible to write one.  You would build a service in Windows that posts a TCP Listener, waits for an inbound connection, and then receives the filename and target path, then performs the copy operation.  Adding in a check to the file size, and then copying block by block (instead of relying on the OS COPY commands) could allow for progress reports (i.e. percentage complete) to be sent to the client if needed.  Then, build a custom client GUI that accepts the file/target names, issues the TCP call to the server, and reports back on progress.  This probably could be done in 2-4 hours of development effort.  However, such a solution seems silly to write when pre-built solutions already exist, and I could EASILY see where this could be used to completely replace OS files if used incorrectly, making it a great hacking tool.  Let's just say that I wouldn't put it on MY server.
ITPOLAuthor Commented:
Thanks for the response, and your ideas.  Unfortunately options 1 and 2 aren't quite right in my particular scenario.

To elaborate a bit; the Fileserver holds around 500 database files.  The DBs are accessed across the network from the client desktops, not all DBs are in use at once, but any number up to about 15 could be.

The current business process (for which I am rewriting the app) has a certain trigger at which point it copies the DB file to a new date-named folder in a different directory on the server.  This is effectively a snaphot of the database, which can be used to restore to that point in time.

As it is the client that is carrying out the copy, I think it would be more efficient for the client to the notify the server to make the relevant backup.  Security concerns can easily be accounted for, the filepaths can be baked in to the logic of the server-side code, and the only parameter passed from client to the server could be the unique reference of the DB, and we're just talking file services here, not web-availability.

Having done some more reading I think that it may be WCF callbacks that I need to understand (unless there are other options?)
Bill BachPresident and Btrieve GuruCommented:
Option 2 would still be far easier (about 5 minutes of VBScript coding), and you would make it easy to extend the environment by just editing the script file text.  Is having a "copy progress" displayed really that critical?
Determine the Perfect Price for Your IT Services

Do you wonder if your IT business is truly profitable or if you should raise your prices? Learn how to calculate your overhead burden with our free interactive tool and use it to determine the right price for your IT services. Download your free eBook now!

ITPOLAuthor Commented:
Agreed it would be easier, but not quite as nice from an end user perspective.  It also means having some thing constantly polling the directories which isn't great.
Bill BachPresident and Btrieve GuruCommented:
OK.  As long as you have a good set of reasons -- writing a service isn't impossible, but it just seems to be more work than I'd want to normally do for a file-copy process.  I did some searching this morning with various keywords, but could not come up with any pre-built solution today.  (I did manage to find a server-side copy, but without status details:   It doesn't mean that it doesn't exist -- just that I couldn't find one.  This just means that you'll have to write it yourself.

The way to go about it is to write a service that posts a TCP listener thread.  When the service receives a new connection, it gets an instruction to issue a file copy command, which can kick off the process based on your built-in file copy locations.  The file copy can easily be implemented with block I/O operations (say, 64KB at a time).  On a periodic basis, the process can send back status updates (i.e. percentage complete) to the client-side application, which would be able to display a progress bar on-screen.  When the copy is complete, the thread is shut down and the connection is terminated.  You'll then need to write the client-side code, too, to connect to the service, issue the command, receive status updates, etc.  Add in some firewall management to allow communications on the ports, and you have a solution.

The difficulty of the service shouldn't be too bad.  I'm sure you can find existing open-source services that already handle the TCP communications process (for both server and client), and the file copy is one simple WHILE loop, with something to send the status reports out.  As a programmer, you can likely figure this out from here.  I've not done a TCP listener in quite some time, but I've done some UDP work recently.  I'd be happy to help with additional suggestions, but need to know where you need additional advice.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
ITPOLAuthor Commented:
Nice one thank you.  I'll take a look and see what I can come up with.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Development

From novice to tech pro — start learning today.