仅当源目录中不存在时才删除目标目录中的文件

Delete file in target directory only if not present in source directory

我正在尝试制作一个程序来备份我的文件。我的复制部分已经在工作,但我想从目标目录中删除源目录中不存在的任何目录或文件。

我的想法大致如下:

// Get existing files in destination
string[] existingTargetFiles = Directory.GetFiles(targetDir, "*.*", SearchOption.AllDirectories);

// Get existing directories in destination
    string[] existingTargetDirectories = Directory.GetDirectories(targetDir, "*", SearchOption.AllDirectories);

// Compare and delete directories that exist in destination but not source
foreach (string existingDirectory in existingTargetDirectories)
{
    if (!Directory.Exists(Path.Combine(sourceDir, existingDirectory)))
        Directory.Delete(Path.Combine(targetDir, existingDirectory));
    }
}

// Compare and delete files that exist in destination but not source
foreach (string existingFiles in existingTargetFiles)
{
    if (!Directory.Exists(Path.Combine(sourceDir, existingFiles)))
        Directory.Delete(Path.Combine(targetDir, existingFiles));
}

}

关于如何制作这样的作品有什么想法吗?

我做了一些更改以获取相对文件路径,然后将其与源目录合并,使用文件 class 进行文件删除等。

我已经改变顺序先删除文件,否则会导致找不到文件的一致性问题,因为在某些情况下文件夹在此之前被删除(因为您正在使用 Directory.GetFiles(targetDir, "*.*", SearchOption.AllDirectories); 递归获取文件列表)

        // Get existing files in destination
        string[] existingTargetFiles = Directory.GetFiles(targetDir, "*.*", SearchOption.AllDirectories);

        // Get existing directories in destination
        string[] existingTargetDirectories = Directory.GetDirectories(targetDir, "*", SearchOption.AllDirectories);

        // Compare and delete files that exist in destination but not source
        foreach (string existingFiles in existingTargetFiles)
        {

            if (!File.Exists(existingFiles.Replace(targetDir, sourceDir)))
            {

                File.Delete(existingFiles);
            }
        }
        // Compare and delete directories that exist in destination but not source
        foreach (string existingDirectory in existingTargetDirectories)
        {

            if (!Directory.Exists(existingDirectory.Replace(targetDir, sourceDir)))
            {
                Directory.Delete(existingDirectory,true);
            }
        }

以下代码将从目标目录中删除目标目录中存在但不在源目录中的所有文件:

       //Source path directory
        string sourceDir = @"G:\Sample\Source";
        //Target path directory
        string targetDir = @"G:\Sample\Destination";

        //Function that will return name of directory or file
        public static string GetDirectoryName(string path)
        {
            return path.Substring((path.LastIndexOf("\") + 1));
        }

        // Get existing files in destination
        string[] existingTargetFiles = Directory.GetFiles(targetDir, "*.*", SearchOption.AllDirectories);
        // Get existing files in source
        string[] existingSourceFiles = Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories);
        // Get existing directories in destination
        string[] existingTargetDirectories = Directory.GetDirectories(targetDir, "*", SearchOption.AllDirectories);
        // Get existing directories in source
        string[] existingSourceDirectories = Directory.GetDirectories(sourceDir, "*", SearchOption.AllDirectories);


        // Compare and delete files that exist in destination but not source
        string TargetFileName = "";
        string SourceFileName = "";
        bool IsTargetFileIsInSourceFileList = false;
        //Getting each single file from Target directory.
        foreach (string existingFiles in existingTargetFiles)
        {
            //Getting only name of current file.
            TargetFileName = GetDirectoryName(existingFiles);
            //Let current file is not present in list of source files. 
            IsTargetFileIsInSourceFileList = false;
            //Getting each single file from Source directory.
            //If current file of Target directory not exists in list of source directory files
            //then IsTargetFileIsInSourceFileList would be false 
            //And if exists the IsTargetFileIsInSourceFileList would be true.
            foreach (string existingSourceFile in existingSourceFiles)
            {
                SourceFileName = GetDirectoryName(existingSourceFile);
                if (string.Equals(TargetFileName, SourceFileName))
                {
                    IsTargetFileIsInSourceFileList = true;
                    break;

                }
            }
            //if IsTargetFileIsInSourceFileList is false and delete the file
            if (!IsTargetFileIsInSourceFileList)
            {
                File.Delete(existingFiles);
            }

        }


        // Compare and delete directories that exist in destination but not source
        foreach (string existingDirectory in existingTargetDirectories)
        {
            //Getting name of directory from path of current directory taken from list.
            string sourceDirPath = Path.Combine(sourceDir, GetDirectoryName(existingDirectory));
            //if name of current directory is not present in list of directories of source
            //Delete the directory
            if (!existingSourceDirectories.Contains(sourceDirPath))
            {
                Directory.Delete(existingDirectory);
            }

        }

我使用我在网上找到的以下递归复制功能,它复制所有文件,子目录深处。我创建了一个递归删除函数来删除目标目录中源目录中不存在的所有文件。这也将遍历所有子目录

Utilities.cs:

public static void Copy(string sourceDirectory, string targetDirectory)
{
    DirectoryInfo diSource = new DirectoryInfo(sourceDirectory);
    DirectoryInfo diTarget = new DirectoryInfo(targetDirectory);

    CopyAll(diSource, diTarget);
}

private static void CopyAll(DirectoryInfo source, DirectoryInfo target)
{
    Directory.CreateDirectory(target.FullName);

    // Copy each file into the new directory.
    foreach (FileInfo fi in source.GetFiles())
    {
        var destinationFile = Path.Combine(target.FullName, fi.Name);
        fi.CopyTo(destinationFile, true);
    }

    // Copy each subdirectory using recursion.
    foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
    {
        DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
        CopyAll(diSourceSubDir, nextTargetSubDir);
    }
}

public static void Delete(string sourceDirectory, string targetDirectory)
{
    DirectoryInfo diSource = new DirectoryInfo(sourceDirectory);
    DirectoryInfo diTarget = new DirectoryInfo(targetDirectory);

    DeleteAll(diSource, diTarget);
}

private static void DeleteAll(DirectoryInfo source, DirectoryInfo target)
{
    if (!source.Exists)
    {
        target.Delete(true);
        return;
    }

    // Delete each existing file in target directory not existing in the source directory.
    foreach (FileInfo fi in target.GetFiles())
    {
        var sourceFile = Path.Combine(source.FullName, fi.Name);
        if (!File.Exists(sourceFile)) //Source file doesn't exist, delete target file
        {
            fi.Delete();
        }
    }

    // Delete non existing files in each subdirectory using recursion.
    foreach (DirectoryInfo diTargetSubDir in target.GetDirectories())
    {
        DirectoryInfo nextSourceSubDir = new DirectoryInfo(Path.Combine(source.FullName, diTargetSubDir.Name));
        DeleteAll(nextSourceSubDir, diTargetSubDir);
    }
}

您可以简单地使用上面的内容:

string SourcePath = @"C:\MySourceFolder\";
string PublishPath = @"C:\Published\";

Utilities.Copy(SourcePath, PublishPath);
Utilities.Delete(SourcePath, PublishPath);