获取数据表中不存在的所有文件
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 秒。
我有一个 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 秒。