Копирование файлов и папок Проверка на существование - PullRequest
0 голосов
/ 05 октября 2019

(новее C #)

У меня есть приложение, которое я создал, который копирует файлы и папки из одного места в другое. У меня изначально были проблемы с папками. По какой-то причине он попытается скопировать файл без создания каталога. Я решил это, добавив второй раздел, чтобы проверить, существует ли папка, а если нет, то создать ее. Я уверен, что есть лучший способ справиться с этим, но это то, что сработало, поэтому я пошел с этим. Конечная цель заключается в следующем.

  1. проверить, существует ли файл / папка в месте назначения и старше, чем исходный файл / папка
  2. Если файл / папка не существует, скопируйте его. Если файл / папка старше источника, скопируйте его.
  3. Если папка файла существует в месте назначения, а не в источнике (что указывает на то, что он был удален), переместите файл из места назначения в архивпапка

Ниже приведено то, что я имею до сих пор, и оно делает все, кроме того, что описано в # 3 выше. Будем весьма благодарны за любые идеи относительно того, как я могу добавить возможность из # 3 в функциональность или упростить копию файлов и создать папку, если она не существует.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FileCopy
{
    class Program
    {
        public static string dtnow = DateTime.Now.ToString("mmdd_hhmm");
        public static string watch_path = string.Empty;
        public static string copy_path = string.Empty;
        public static string final_copy_path = string.Empty;
        public static string log_folder = @"C:\copylogs";
        //public static string log_file = "copy_log";
        public static string log_file = Path.Combine(log_folder + "\\copy_log" + dtnow + ".txt");
        public static int newer_count = 0;
        public static int skip_count = 0;
        public static int copy_count = 0;
        public static int totalcount = 0;
        public static int currentcount = 0;

        static void Main(string[] args)
        {
            if (args == null || args.Length < 2)
            {
                Console.WriteLine("Invalid Syntax");
                return;
            }
            else
            {
                watch_path = args[0];
                copy_path = args[1];
                log_start_Check(log_folder,log_file);
                CopyFolder(watch_path, copy_path);
                finalcount_statement();
            }

        }

// Log Folder check and creation
        public static void log_start_Check(string log_folder, string log_file)
        {
            Console.Write("Checking Log Folder: ");
            if (!Directory.Exists(log_folder))
            {
                try
                {
                    Directory.CreateDirectory(log_folder);
                    Console.WriteLine("Created!");
                }
                catch (Exception error)
                {
                    Console.WriteLine("Unable to Create Directory" + error);
                    return;
                }
            }
            else
            {
                Console.WriteLine("Exists");
            }
            Console.Write("Checking Log File: ");
            //Console.WriteLine(log_file);
            if (!File.Exists(log_file))
            {
                try
                {
                    File.Create(log_file);
                    Console.WriteLine("Created!");
                }
                catch (Exception error)
                {
                    Console.WriteLine("Unable to Create file" + error);
                    return;
                }
            }
            else
            {
                Console.WriteLine("Exists");
            }
            Console.WriteLine();
        }

// Copy Folder Functions
        static public void CopyFolder(string sourceFolder, string destFolder)
        {
            try
            {
                if (!Directory.Exists(destFolder))
                    Directory.CreateDirectory(destFolder);
                totalcount = Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories).Count();
                string[] files = Directory.GetFiles(sourceFolder);
                totalcount = files.Length;
                foreach (string file in files)
                {
                    string name = Path.GetFileName(file);
                    FileInfo source_info = new FileInfo(file);
                    string dest = Path.Combine(destFolder, name);
                    FileInfo dest_info = new FileInfo(dest);
                    if (File.Exists(dest))
                    {
                        try
                        {
                            if (source_info.LastWriteTime > dest_info.LastWriteTime)
                            {
                                //Console.Write("\r" + currentcount + " of " + totalcount + " Completed     ");
                                Console.ResetColor();
                                Console.ForegroundColor = ConsoleColor.Yellow;
                                File.Copy(file, dest, true);
                                Console.Write("\rFile Newer, File Copied " + dest + "                         ");
                                Console.ResetColor();
                                newer_count++;
                            }
                            else
                            {
                                //Console.Write("\r" + currentcount + " of " + totalcount + " Completed     ");
                                Console.ResetColor();
                                Console.ForegroundColor = ConsoleColor.Red;
                                Console.Write("\r** - File Exists " + dest + "                         ");
                                Console.ResetColor();
                                skip_count++;
                            }                          
                        }
                        catch (Exception error)
                        {
                            error_handling("Error in Application " + error.Message, dest, file);
                        }
                    }
                    else
                    {
                        try
                        {
                            //Console.Write("\r"+currentcount + " of " + totalcount + " Completed     ");
                            Console.ResetColor();
                            Console.ForegroundColor = ConsoleColor.Green;
                            File.Copy(file, dest, false);
                            Console.Write("\rFile Copied " + dest + "                         ");
                            Console.ResetColor();
                            copy_count++;
                        }
                        catch (Exception error)
                        {
                            error_handling("Error in Application " + error.Message, dest, file);
                        }
                    }
                    currentcount++;
                }
                string[] folders = Directory.GetDirectories(sourceFolder);
                foreach (string folder in folders)
                {
                    string name = Path.GetFileName(folder);
                    string dest = Path.Combine(destFolder, name);
                    CopyFolder(folder, dest);
                }
            }
            catch (Exception error)
            {
                error_handling("Error in Application " + error.Message, null, null);
            }
        }
// Error Handling to add messages to logs
        public static void error_handling(string message, string fileident, string source)
        {
            using (System.IO.StreamWriter myFile = new System.IO.StreamWriter(log_file, true))
            {
                string finalMessage = string.Format("{0}: {1} SOURCE: {3} - DEST: {2}", DateTime.Now, message, fileident, source, Environment.NewLine);
                myFile.WriteLine(finalMessage);
                myFile.Close();
            }
        }
        // Final Statement
        public static void finalcount_statement()
        {
            Console.WriteLine("");
            Console.WriteLine("--------------------------------------------------------------------------------------------");
            Console.WriteLine("Total New Files Copied: " + copy_count);
            Console.WriteLine("Total Newer Files Updated: " + newer_count);
            Console.WriteLine("Total Files Skipped: " + skip_count);
            Console.WriteLine("--------------------------------------------------------------------------------------------");
            Console.WriteLine("");
            Console.WriteLine("");
        }
    }
}

1 Ответ

0 голосов
/ 05 октября 2019

Вы можете сделать это так же, может быть так:

static public void ArchiveCopyFolder(string sourceFolder, string destFolder)
{
    try
    {
        if (!Directory.Exists(sourceFolder))
        {
            Directory.CreateDirectory(archivefolder + destFolder);
            //Copy folder and files
        }
    }
}
...