文件未正确复制到新位置

时间:2018-09-13 04:18:33

标签: c# file-io windows-services

我写了一个c#代码,将csv文件复制到新位置。

如果文件已存在于目标位置中,则应删除该文件,然后将新文件粘贴回去。

由于csv文件每5分钟更新一次,因此该过程应重复进行并在后台运行。

当前问题是,即使文件已在目标路径中删除,也不会回写新文件。

我的代码:

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()
        {
        }
    }
}

谁能找出错误所在?

3 个答案:

答案 0 :(得分:1)

我想你的意思是即使有文件也要写文件。

您正在使用:

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

删除else:

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

答案 1 :(得分:1)

如果文件不存在,

File.Delete实际上不会引发任何异常。因此,我将删除整个存在的检查。

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) {}

您也可以在这篇文章中查看:

FileStream and a FileSystemWatcher in C#, Weird Issue "process cannot access the file" 和用户EventHorizo​​n的答案检查文件是否关闭。

还建议检查目录是否具有权限(FileIOPermissionAccess.Write)

答案 2 :(得分:1)

使用它来复制目标路径中存在的文件以及该文件的备份计划。

// 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.
        }