C#如何在不使用File.Move的情况下重命名文件

时间:2017-07-10 12:14:36

标签: c# performance file rename

我有一个连接到服务器的ac#应用程序,获取datagrid,操作每一行,然后根据每个更新的行将新行上传到服务器,每行一个文件在hdd上重命名。

该应用程序完全正常,但我使用分析器进行了分析,并意识到这行代码:

File.Move(symbolsOldPath, symbolsPath); 

我的应用程序需要80%的时间来完成其任务。

如果有一种不同的方式可以获得更好的性能,我在StackOverflow和其他问题上完成了所有问题,但我并没有成功。我发现的唯一另一种方法是实现VB以使用Rename方法,但是因为它调用了File.Move方法,所以没有任何改进。你们知道另一种表现更好的方式吗?

这是我改变数据的类的代码。

    public DataTable ChangeData(DataTable unchangedData, string searchPathSymbols, string searchPathImages, ProgressBar pbForm)
    {
        pbtemp = pbForm;
        int rowCount = unchangedData.Rows.Count;

        foreach (DataRow row in unchangedData.Rows)
        {
            counter++;

            if (counter == 10)
            {
                pbtemp.Value += counter;
                counter = 0;
                Application.DoEvents();
            }

            number = row[1].ToString();
            symbolsPath = row[2].ToString();
            symbolsPathCopy = symbolsPath;
            imagesPath = row[3].ToString();
            imagesPathCopy = imagesPath;

            aliasSymbols = symbolsPath.Substring(0, symbolsPath.IndexOf('>') + 1);

            if (symbolsPath == imagesPath)
            {
                if (aliasSymbols.Contains("Symbole"))
                {
                    if (!string.IsNullOrEmpty(symbolsPath))
                    {
                        SymbolsChanger(searchPathSymbols, row);
                        row[3] = row[2];
                    }
                }

                else
                {
                    if (!string.IsNullOrEmpty(imagesPath))
                    {
                        ImagesChanger(searchPathImages, row);
                        row[2] = row[3];
                    }
                }
            }

            else
            {
                if (!string.IsNullOrEmpty(symbolsPath))
                {
                    SymbolsChanger(searchPathSymbols, row);
                }

                if (!string.IsNullOrEmpty(imagesPath))
                {
                    ImagesChanger(searchPathImages, row);
                }
            }
        }
        pbtemp.Value += (rowCount - pbtemp.Value);
        return unchangedData;
    }

    private void SymbolsChanger(string searchPathSymbols, DataRow row)
    {
        string symbolsOldPath;
        //Symbols
        //Get and delete Alias and get filepath

        int countAliasSymbolsIndex = symbolsPath.LastIndexOf('>') + 1;
        symbolsPath = symbolsPath.Remove(0, countAliasSymbolsIndex);
        symbolsOldPath = searchPathSymbols + "\\" + symbolsPath;

        //Remove and replace numbers
        int startSymbolsIndex = 0;
        int endSymbolsIndex = symbolsPath.IndexOf('_') == -1 ? symbolsPath.LastIndexOf('.') : symbolsPath.IndexOf('_');
        int countSymbolsIndex = endSymbolsIndex - startSymbolsIndex;
        symbolsPath = symbolsPath.Remove(startSymbolsIndex, countSymbolsIndex);
        string nameSymbols = number + symbolsPath;
        symbolsPath = searchPathSymbols + "\\" + nameSymbols;

        try
        {
            //Rename file
            File.Move(symbolsOldPath, symbolsPath);             
        }
        catch(FileNotFoundException)
        {
            try
            {
                File.Move(symbolsPath, symbolsPath);
            }
            catch (FileNotFoundException)
            {
                logArrayDataChange.Add(symbolsPathCopy);
            }

        }

        row[2] = aliasSymbols + nameSymbols;
    }

    private void ImagesChanger(string searchPathImages, DataRow row)
    {
        string imagesOldPath;
        //Images
        //Get and delete Alias and get filepath
        string aliasImage = imagesPath.Substring(0, imagesPath.IndexOf('>') + 1);
        int countAliasImagesIndex = imagesPath.LastIndexOf('>') + 1;
        imagesPath = imagesPath.Remove(0, countAliasImagesIndex);
        imagesOldPath = imagesPath.StartsWith("\\") == true ? searchPathImages + imagesPath : searchPathImages + "\\" + imagesPath;

        //Remove and replace numbers
        int startImagesIndex = imagesPath.LastIndexOf("\\") == -1 ? 0 : imagesPath.LastIndexOf("\\");
        int endImagesIndex = imagesPath.IndexOf('_') == -1 ? imagesPath.LastIndexOf('.') : imagesPath.IndexOf('_');
        int countImagesIndex = endImagesIndex - startImagesIndex;
        imagesPath = imagesPath.Remove(startImagesIndex + 1, countImagesIndex - 1);

        int insertIndex = imagesPath.LastIndexOf("\\") == -1 ? 0 : imagesPath.LastIndexOf("\\");
        string nameImages = imagesPath.Insert(insertIndex + 1, number);
        imagesPath = searchPathImages + "\\" + nameImages;

        try
        {
            //Rename file
            File.Move(imagesOldPath, imagesPath);               
        }
        catch (FileNotFoundException)
        {
            try
            {
                File.Move(imagesPath, imagesPath);
            }
            catch (FileNotFoundException)
            {
                logArrayDataChange.Add(imagesPathCopy);
            }
        }

        row[3] = aliasImage + nameImages;
    }
}

}

1 个答案:

答案 0 :(得分:4)

我会保持File.Move来完成这项工作。除了一点开销(支票),File.Move uses only the native MoveFile Windows call移动文件:

[DllImport(KERNEL32, SetLastError=true, CharSet=CharSet.Auto, BestFitMapping=false)]
[ResourceExposure(ResourceScope.Machine)]
internal static extern bool MoveFile(String src, String dst);

您可以自己调用该方法,但我怀疑它会比这更快。

the documentation起,似乎已经建立了移动以有效重命名:

  

MoveFile函数将移动(重命名)文件或目录......