我怎样才能使这个脚本读取一个Excel,然后find并复制文件运行速度更快?

我的脚本读取Excel表格并获取一个范围,范围包含不同媒体文件的名称,我将其添加到一个大的列表中。 我使用列表中的名称来search目录,如果它们存在于给定的文件目录中,那么它们将被添加到“existsAlready”列表中。 如果它们不存在于copyFiles目录中的给定文件位置BUT中,那么它们被复制到给定的目录并被添加到“existsAdded”列表中。 如果在任一目录中都找不到,则将这些文件添加到“existsNegative”列表中。 所有3个列表打印到单独的列表框。

这一切工作,但是我发现它运行有点慢:

1)虽然Excel应用程序不可见,但它仍然启动一秒钟,然后closures,减慢进程。

2)如果文件夹中存在所有文件或者文件需要复制,应用程序运行良好/快速,但是如果在目录中找不到许多文件并且无法复制,则运行速度非常慢,我怎样才能做到这一点更快? 我想这与它必须要search整个目录,而不是find任何东西。

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook excelWorkbook = excelApp.Workbooks.Open("@Excelfile"); Excel.Worksheet xlWorkSheet = (Excel.Worksheet)excelWorkbook.Sheets[1]; excelApp.Visible = false; excelApp.ScreenUpdating = false; excelApp.DisplayAlerts = false; Excel.Range range = xlWorkSheet.get_Range(B1:G1); List<string> listFBX = new List<string>(); foreach (Excel.Range s in range) { listFiles.Add(s.Text()); } List<string> existsAlready = new List<string>(); List<string> existsAdded = new List<string>(); List<string> existsNegative = new List<string>(); foreach (var item in listFiles) { string curFile = "X:\\Private\\DATA\\PROJECT DATA\\Database\\" + item; string copyFrom = "X:\\Private\\DATA\\PROJECT DATA\\FilesToSearch" + item; if (File.Exists(curFile)) { existsAlready.Add(item); } else if (!File.Exists(curFile) && File.Exists(copyFrom)) { File.Copy(copyFrom, curFile, true); existsAdded.Add(item); } else { existsNegative.Add(item); } } for (int i = 0; i < existsAlready.Count; i++) { listBox1.Items.Add(existsAlready.ElementAt(i)); } for (int i = 0; i < existsAdded.Count; i++) { listBox2.Items.Add(existsAdded.ElementAt(i)); } for (int i = 0; i < existsNegative.Count; i++) { listBox3.Items.Add(existsNegative.ElementAt(i)); } 

关于第一点,你可以设置excelApp.Visible = false; 只要你宣布excelApp ,即它将是第二行。

关于第二点,当文件不在那里时,你不是不得不执行更多的检查吗? 那里有什么样的时间/性能差异? 如果您期望许多文件不存在,则可以考虑交换If语句的顺序。

而不是执行!File.Exists,为什么不为数据库中的所有文件名和FilesToSearch目录创build另一个列表。 然后做一个包含,看看你正在迭代的当前文件是否在该列表中。 然后执行File.Copy方法并将其添加到Exists列表中。

  List<string> databaseFiles = new List<string>(Directory.GetFiles("X:\\Private\\DATA\\PROJECT DATA\\Database")); List<string> filesToSearch = new List<string>(Directory.GetFiles("X:\\Private\\DATA\\PROJECT DATA\\FilesToSearch")); foreach(var item in listFiles) { var curFile = Path.Combine("X:\\Private\\DATA\\PROJECT DATA\\Database\\", item); var copyFrom = Path.Combine("X:\\Private\\DATA\\PROJECT DATA\\CopyFrom\\", item); if (databaseFiles.Contains(curFile)) { existsAlready.Add(item); } else { if (filesToSearch.Contains(copyFrom)) { File.Copy(copyFrom, curFile, true); existsAdded.Add(item); } else { existsNegative.Add(item); } } }