所以,我在我的应用程序上有这段代码块,它可以扫描目录中的文件,并与之建立一个列表,并将该列表与数据库中文件的列表进行比较(如果该目录的路径在db中存在)并将它们之间的差异添加到其他两个列表之一。在这里是:
if (id > 0)
{
var dbDrawingList = mdl_drawing.GetDrawingsByBaseId(id);
var counter = 0;
if (dbDrawingList.Count() < serverDrawingList.Count())
{
counter = serverDrawingList.Count();
}
else
{
counter = dbDrawingList.Count();
}
for (int i = 0; i <= counter; i++)
{
if (i < serverDrawingList.Count())
{
if (dbDrawingList.Select(f => f.partNumber).Contains(serverDrawingList[i].partNumber) == false)
{
onServerAndNotDb.Add(serverDrawingList[i]);
}
}
if (i < dbDrawingList.Count())
{
if (serverDrawingList.Select(f => f.partNumber).Contains(dbDrawingList[i].partNumber) == false)
{
onDbAndNotServer.Add(dbDrawingList[i]);
}
}
}
serverDrawingList = null;
dbDrawingList = null;
}
有人能做得到更好的方法吗?(可以有多个同名文件,因此Except
方法不起作用)
答案 0 :(得分:-1)
我有一个方法可以做到这一点,这就是我实现它的方式,并且到目前为止它一直在起作用:
private void deleteRegistersFromFilesThatWasRemoved(string path)
{
// add local files to list
List<string> allFiles = new List<string>();
string[] dirs = Directory.GetDirectories(path, "*",
SearchOption.TopDirectoryOnly);
foreach (var dir in dirs)
{
string[] files = Directory.GetFiles(dir, "*", SearchOption.TopDirectoryOnly);
foreach (var file in files)
{
if(file != path)
{
allFiles.Add(file);
}
}
}
// list for file records in the database
List<string> record = new List<string>();
string queryfiles = //your query
SqlCommand cmd = new SqlCommand(queryfiles, connection);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
SqlDataReader read = cmd.ExecuteReader();
while (read.Read())
{
// I have path and file name separated that's why here's a string sum
string r = read[2].ToString() + read[1].ToString();
record.Add(r);
}
cmd.Connection.Close();
for (int i = 0; i < record.Count; i++)
{
if (!allFiles.Contains(record[i]))
{
// do something if the record on the database is not in the local
//files list
}
}
}
}