获取数据表中不存在的所有文件

Get all files not present int a datatable

我有一个 MySQL table 和一个文件名列表。 仅当 table.

中不存在文件名时,我才想获取目录中所有文件的列表

我可以将数据库文件的列表放在 Datatable 中,然后写下类似这样的内容:

 string[] files = Directory.GetFiles(directory);
 foreach (Datarow row in dataTable.Rows)
   for (int i=0; i<files.Length; i++)
      if (row[0].equals(files[i]) {
          files[i].delete();
          break;
       }

上面的代码只是一个伪例子。我不能通过指定过滤器直接使用 Directory.GetFiles(directory) 以便不写所有迭代吗?

一个 linq 解决方案是:

Directory.GetFiles(directory)
         .Where(x => !dataTable.AsEnumerable()
                .Select(row => row[0].ToString()) 
                .Contains(x))

请在下面找到代码片段

决定分步进行 - 拥有更易于维护的代码

void Main()
{
    // given a list of files from db
    DataTable dataTable = new DataTable("x");  
    dataTable.Columns.Add("file", typeof(string));  
    dataTable.Rows.Add("HaxLogs.txt");dataTable.Rows.Add("swapfile.sys");dataTable.Rows.Add("four.txt");
    var directory = "c:\";
    var directoryFilesWithPaths = Directory.GetFiles(directory)
            .Select( x=> new FileEntry { Path = x, FileName = Path.GetFileName(x)});

            var directoryFiles = directoryFilesWithPaths.Select(x => x.FileName).ToList();
            var filesList = (from DataRow dr in dataTable.Rows
                            select dr[0].ToString()).ToList();

            var filesToProcess = directoryFiles.Except(filesList);
        foreach (var file in filesToProcess)
        {
            // process file here

            Console.WriteLine(file);
        }

}

这是我的解决方案:

 ArrayList files = new ArrayList();
 files.AddRange(Directory.GetFiles(directory, "*.*", SearchOption.AllDirectories));
        foreach (DataRow row in tableFiles.Rows)
        {
            for (int i = 0; i < files.Count; i++)
                if (files[i].ToString().EndsWith(row[0].ToString()))
                {
                    files.RemoveAt(i);
                    break;
                }
        }

我还尝试使用 Path.GetFileName(files[i].ToString() 以便使用 Equals EndsWith,但对于 8500 个文件,此解决方案需要 2 秒,GetFileName 需要 10 秒。