0

I have written a c# code to copy a csv file to a new location.

If the file already exists in the target location file should be deleted and paste the new file back.

This process should be recurring and runs in the background since the csv file is updating every 5 minutes.

The current issue is even the file was deleted in the target path the new file won't be written back.

My code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace filemove
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {                
        }

        public void Start()
        {                
            mysql();
        }

        static void mysql()
        {
            string fileName = "data.csv";
            string sourcePath = @"\\192.168.16.12\Users";
            string targetPath = @"C:\Users\Admin\source";

            // Use Path class to manipulate file and directory paths.
            string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
            string destFile = System.IO.Path.Combine(targetPath, fileName);

            // To copy a folder's contents to a new location:
            // Create a new target folder, if necessary.
            if (!System.IO.Directory.Exists(targetPath))
            {
                System.IO.Directory.CreateDirectory(targetPath);
            }

            // To copy a file to another location and 
            // overwrite the destination file if it already exists.
            System.IO.File.Copy(sourceFile, destFile, true);

            // To copy all the files in one directory to another directory.
            // Get the files in the source folder. (To recursively iterate through
            // all subfolders under the current directory, see
            // "How to: Iterate Through a Directory Tree.")
            // Note: Check for target path was performed previously
            //       in this code example.
            if (System.IO.Directory.Exists(sourcePath))
            {    
                string[] files = System.IO.Directory.GetFiles(sourcePath);

                // Copy the files and overwrite destination files if they already exist.
                foreach (string s in files)
                {
                    // Use static Path methods to extract only the file name from the path.
                    fileName = System.IO.Path.GetFileName(s);
                    destFile = System.IO.Path.Combine(targetPath, fileName);
                    FileInfo info = new FileInfo(destFile);
                    bool exists = info.Exists;
                    if (exists == true)
                    {
                        File.Delete(@"C:\Users\Admin\source\Bargstedt.csv");
                    }
                    else
                    { 
                        System.IO.File.Copy(s, destFile, true);                          
                    }
                }
            }
            else
            {
                Console.WriteLine("Source path does not exist!");
            }

            // Keep console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            //Console.ReadKey();
        }

        public void OnStop()
        {
        }
    }
}

Can anyone figure out what's the error is?

ProgrammingLlama
  • 36,677
  • 7
  • 67
  • 86
Simon
  • 195
  • 2
  • 4
  • 18

3 Answers3

1

I think you mean to write the file even if there was a file.

You're using:

bool exists = info.Exists;
if (exists == true)
{
    File.Delete(@"C:\Users\Admin\source\Bargstedt.csv");
}
else
{ 
    System.IO.File.Copy(s, destFile, true); 
}

Remove the else:

bool exists = info.Exists;
if (exists == true)
{
    File.Delete(@"C:\Users\Admin\source\Bargstedt.csv");
} 
System.IO.File.Copy(s, destFile, true);
trademarq
  • 90
  • 8
  • thanks for your answer. It actually worked. I only need one file to be copied from the original source but it has copied all the files in the parent location. I reckon the reason should be "foreach (string s in files)" line. Do you know how to fix this? Thanks! @Trademarq – Simon Sep 13 '18 at 05:00
  • 1
    @simon: you can remove the foreach loop if only wish to copy one file. – Gauravsa Sep 13 '18 at 05:05
1

File.Delete actually doesn't throw any exception if file doesn't exists. So, I will just remove a check for exists entirely.

try {
int delay = 400;

File.Delete(@"C:\Users\Admin\source\Bargstedt.csv");
Thread.Sleep(delay); // to prevent delete and copy happening at the 
// same time.

System.IO.File.Copy(s, destFile, true);                          

}catch (IOException ex) {}

You can also check at this post:

FileStream and a FileSystemWatcher in C#, Weird Issue "process cannot access the file" and user EventHorizon's answer checking for if file is closed.

Its also advisable to check whether directory has permissions (FileIOPermissionAccess.Write)

Gauravsa
  • 6,330
  • 2
  • 21
  • 30
1

Use this to copy a file when it is existing in target path and with a backup plan for that existing file.

// To copy a file to another location and 
        // overwrite the destination file if it already exists.
        if (!File.Exists(destFile))
        {
            System.IO.File.Copy(sourceFile, destFile, true);
        }
        else
        {
            System.IO.File.Move(destFile, existingFilePath); //if file is existing and then move it to specific folder
            try
            {
                System.IO.File.Copy(sourceFile, destFile, true);
            }
            catch (Exception)
            {
                System.IO.File.Move(existingFilePath, destFile); //If anythig went wrong, old file is relocated correctly
            }
            System.IO.File.Delete(existingFilePath); // Delete old file, all is ok now.
        }