如何使这个脚本读取excel,然后查找和复制文件运行得更快?

时间:2017-09-26 17:11:51

标签: c# excel visual-studio performance

我的脚本读取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));
        }

2 个答案:

答案 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语句的顺序。