从备份应用程序 C# 中排除文本文件等

Excluding text files etc. from a backup application C#

private void btn_Backup_Click(object sender, EventArgs e)
    {
        List<DirectoryInfo> SourceDir = this.lbox_Sources.Items.Cast<DirectoryInfo>().ToList();
        List<DirectoryInfo> TargetDir = this.lbox_Targets.Items.Cast<DirectoryInfo>().ToList();

        foreach (DirectoryInfo sourcedir in SourceDir)
        {
            foreach (DirectoryInfo targetdir in TargetDir)
            {
                string dateString = DateTime.Now.ToString("MM-dd-yyyy_H.mm.ss");
                string LogFileName = @"BackupLog_" + sourcedir.Name + @"_" + dateString + @".log";
                string[] lines = { dateString + "\t" + sourcedir.FullName + "\t" + targetdir.FullName + "\t" + "COMPLETED" };

                if (this.checkbox_zipfiles.Checked == true)
                {
                    System.IO.Compression.ZipFile.CreateFromDirectory(sourcedir.FullName, targetdir.FullName + @"\BACKUP_" + sourcedir.Name + @"_" + dateString + @".zip");
                    System.IO.File.WriteAllLines(tbox_LogFiles.Text + @"\" + LogFileName, lines);
                }
                else
                {
                    foreach (var file in sourcedir.GetFiles())
                    {
                        Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(sourcedir.FullName, targetdir.FullName, true);
                        System.IO.File.WriteAllLines(tbox_LogFiles.Text + @"\" + LogFileName, lines);
                    }
                }
            }
        }
    }

我需要从备份中排除某些文件(例如 .txt .docx) 我在我的表单上使用一个列表来添加这些例外。 我还需要排除某些文件和文件夹,但我想如果我知道该怎么做,我可以做到。

private void btn_AddFileTypeException_Click(object sender, EventArgs e)
    {
        Form_FileTypeExceptions frm = new Form_FileTypeExceptions(new FileException());

        if (frm.ShowDialog() == DialogResult.OK)
        {
            this.lbox_FileTypeExceptions.Items.Add(frm.Exception);
        }
    }

有什么想法吗?

在您要设置要排除的扩展名的表单中,填写将包含要跳过的扩展名的字符串列表,如下所示:

List<string> extensionsToSkip = new List<string>();
extensionsToSkip.Add(".txt");
extensionsToSkip.Add(".docx");
//etc...

在您的内部循环中,将 foreach 循环从

更改为
foreach (var file in sourcedir.GetFiles())

进入这个

foreach (var file in sourcedir.GetFiles()
    .Where(f => !extensionsToSkip.Contains(f.Extension)).ToList())

如您所见,当您使用 GetFiles 获取文件集合时,它将被过滤以排除 extensionsToSkip 列表中指定的扩展名。

在提到的循环之前,通过观察两个列表(仅用于测试)来测试您是否获得了正确数量的文件:

var originalList = sourcedir.GetFiles();
var filteredList = sourcedir.GetFiles().Where(f => !extensionsToSkip.Contains(f.Extension)).ToList();