C# - 复制文件 - 从文件夹到文件夹 - 仅新文件(如同步) - 一个想法

C# - Copy files - from folder to folder - only new files (like sync) - an idea

谁能帮我用 C# 编写代码,我需要的是一个程序,可以将文件从文件夹复制到文件夹,如同步,但如果在第一个文件夹中删除了文件,则不删除它们。例如,第一个文件夹是 "source" 文件夹,第二个文件夹是 "destination" 文件夹。

例如,我的 "source" 文件夹是我来自 iCloud 的照片同步文件夹。那里有照片,我的程序将所有文件从它复制到目标文件夹。但是,如果我从源中删除照片或照片以不同步目标文件夹。如果源中有新照片要复制到目标文件夹。我的想法是将我 phone 中的所有照片都放在目的地文件夹中。我不能将它们放在源文件夹中,因为如果我从 phone 中删除照片,它会与文件夹同步,然后从源文件夹中删除。而且我不想每次都将新照片从一个文件夹复制到另一个文件夹。只是一个小程序,用于检查是否有不在目标文件夹中的新照片并将它们复制到目标文件夹中。

哦,这个简单的事情说了很多话,但希望能帮助理解我想要的东西。第二件事是程序将如何检查源文件夹中是否有变化?无论如何,希望有人有想法,也许用代码举例会很好。谢谢。


最新来源:

已删除

这里是更新后的代码。我通过将事件处理程序从 "Changed" 更改为 "Created" 做了一些小的更正,检查文件是否存在,并应用错误处理来检查文件是否可用,然后再尝试访问它。

  private static void Main(string[] args)
    {
        watch();
        syncAllFilesFirstTime();
        Console.ReadLine();
    }

    private static void syncAllFilesFirstTime()
    {
        //Get list of files from sourcepath
        string[] arrFiles = Directory.GetFiles(strSourcePath);

        foreach (string sourceFiles in arrFiles)
        {
            //get filename
            string strFileName = Path.GetFileName(sourceFiles);
            string strDesFilePath = string.Format(@"{0}\{1}", strDesPath, strFileName);
            //check whether the destination path contatins the same file
            if (!File.Exists(strDesFilePath))
                File.Copy(sourceFiles, strDesFilePath, true);
        }
    }

    private static void syncUpdatedFiles(string strSourceFile)
    {
        //get filename
        string strFileName = Path.GetFileName(strSourceFile);
        string strDesFilePath = string.Format(@"{0}\{1}", strDesPath, strFileName);
        var val = File.Exists(strDesFilePath);
        //check whether the destination path contatins the same file
        if (!File.Exists(strDesFilePath))
        {
            for (; ;)
            {
                if (IsFileLocked(strSourceFile))
                {
                    File.Copy(strSourceFile, strDesFilePath, true);
                    break;
                }
            }
        }

    }

    private static void watch()
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = strSourcePath;
        //watcher.NotifyFilter = NotifyFilters.LastWrite;
        watcher.Filter = "*.*";
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.EnableRaisingEvents = true;
    }

    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
        syncUpdatedFiles(e.FullPath);
    }

    public static bool IsFileLocked(string strSourcePath)
    {
        try
        {
            using (Stream stream = new FileStream(strSourcePath, FileMode.Open))
            {
                return true;
            }
        }
        catch
        {
            return false;
        }
    }

问题是目标(备份)中的文件已经存在。

使用这个版本的File.Copy(sourceFileName As String, destFileName As String, overwrite As Boolean)https://msdn.microsoft.com/en-us/library/9706cfs5(v=vs.110).aspx),参数覆盖为true就可以了。您使用的版本已覆盖为 false,因此当文件已存在时会抛出异常。