路径简化/减少

时间:2009-09-23 16:47:33

标签: boost path filesystems

我正在编写一些代码来管理磁盘文件结构上的自定义并将其与未连接的系统同步。我的一个要求是能够在实际生成同步内容之前估计同步的大小。作为一个简单的解决方案,我将一个带有完整路径文件名的地图放在一起,作为有效查找已扫描内容的关键。

当我的文件结构中有多个文件以不同方式从不同位置引用时,我遇到了问题。例如:

C:\DataSource\files\samplefile.txt
C:\DataSource\data\samples\..\..\files\samplefile.txt
C:\DataSource\etc\..\files\samplefile.txt

这3个路径字符串都引用磁盘上的相同文件,但它们的字符串表示形式不同。如果我逐字地将这些放入地图中,我会将samplefile.txt的大小计算3次,而我的估计是错误的。

为了找到解决这个问题的方法,我希望boost :: filesystem :: path提供了一个减少或简化路径的函数,但我没有看到任何类型的东西。使用路径分解表和路径迭代器,我编写了以下函数(用于Windows环境):

std::string ReducePath( std::string Path )
{
    bfs::path input( Path );
    bfs::path result( "" );
    bfs::path::iterator it, endIt;
    for( it = input.begin( ), endIt = input.end( ); it != endIt; it ++ )
    {
        if( (*it) == ".." )
        {
            // Remove the leaf directory.
            result = result.parent_path( );
        }
        else if( (*it) == "." )
        {
            // Just ignore.
        }
        else
        {
            // Append the element to the end of the current result.
            result /= (*it);
        }
    }

    return result.string( ).c_str( );
}

我有两个问题。

一,是否有提供此类功能的标准功能,或者这已经存在于某个地方的boost或其他库中?

二,我并不完全相信我所写的功能在所有情况下都会起作用,我想更多地关注它。它适用于我的测试。有没有人看到它会崩溃的情况?

2 个答案:

答案 0 :(得分:2)

boost中有一个函数

bool equivalent(const Path1& p1,const Path2& p2);

检查两条路径是否相等。这将是理想的,除了没有等效的<运营商(也许不可能)。

  

有没有人看到这会破坏的情况......

也许;如果您输入“../test.txt”,则父路径可能无法执行您想要的操作。我建议先完成这条路。

请参阅文件系统库中的“完整”。

祝你好运 - 罗伯特尼尔森

答案 1 :(得分:1)

虽然不是一个确切的欺骗,但这个问题将有助于: Best way to determine if two path reference to same file in Windows?