【问题标题】:C# How to rename a file without using File.MoveC# 如何在不使用 File.Move 的情况下重命名文件
【发布时间】:2017-12-14 04:05:53
【问题描述】:

我有一个 ac# 应用程序,它连接到服务器、获取数据网格、操作每一行,然后根据每个更新的行将新行上传到服务器,并且每行一个文件在硬盘上重命名。

该应用程序运行良好,但我使用分析器对其进行了分析,并意识到这行代码:

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;
    }
}

}

【问题讨论】:

  • File.Move 是这样做的方法
  • 如果工作正常,有什么问题?如果您分析任何代码,总会有一些事情比其他任何事情都需要更多时间。
  • 不要太着迷于分析器 % - 所用的总时间必须等于 100%,因此 something 必须占用更大 % 的时间。 .
  • 我知道,但我总是对优化我的代码以充分利用它感到好奇。
  • 需要多长时间?

标签: c# performance file rename


【解决方案1】:

我会保留File.Move 来完成这项工作。除了一点点开销(检查),File.Moveuses 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 看来,move 已经构建为可以有效地重命名:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多