Reputation: 305
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?
Upvotes: 0
Views: 567
Reputation:
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.
}
Upvotes: 1
Reputation: 6528
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)
Upvotes: 1
Reputation: 90
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);
Upvotes: 1