我的脚本读取excel表并获取范围,该范围包含不同媒体文件的名称,我将其添加到一个大列表中。我使用列表中的名称来搜索目录,如果它们存在于给定的文件目录中,则它们将被添加到“existsAlready”列表中。如果它们不存在于给定文件位置但是存在于copyFiles目录中,则它们将被复制到给定目录并被添加到“existsAdded”列表中。如果在任一目录中找不到它们,则将文件添加到“existsNegative”列表中。所有3个列表都打印到单独的列表框中。
这一切都有效,但我发现它运行有点慢:
1)虽然excel应用程序不可见,但它仍会启动一秒钟然后关闭,从而减慢了整个过程。
2)如果文件夹中存在所有内容或者必须复制文件,应用程序运行正常/快速,但是如果目录中找不到大量文件并且无法复制它运行速度很慢,怎么能我加快了吗?我想这与它必须搜索整个目录而没有找到任何东西有关。
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));
}
答案 0 :(得分:1)
为什么不为数据库中的所有文件名和FilesToSearch目录创建另一个列表,而不是执行!File.Exists。然后执行包含以查看您正在迭代的当前文件是否在该列表中。然后执行File.Copy方法&amp;将其添加到“存在”列表中。
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);
}
}
}
答案 1 :(得分:1)
关于第一点,您可以在声明self.emitterView.createEmitter(
"fragments",
particleName: "Fragment",
duration: 0.6,
configureClosure: nil).update { (layer, _) in
if progress > end {
layer.birthRate = 0
}
}.play()
后立即设置excelApp.Visible = false;
,即它将是第二行。
关于第二点,当文件不存在时,您是否不得不执行更多检查?有什么样的时间/性能差异?如果您期望许多文件不存在,您可以查看交换If语句的顺序。