【发布时间】:2010-11-30 20:05:05
【问题描述】:
我正在编写一些代码来管理磁盘上的自定义文件结构并将其同步到未连接的系统。我的要求之一是能够在实际生成同步内容之前估计同步的大小。作为一个简单的解决方案,我将一个包含完整路径文件名的地图放在一起,作为有效查找已扫描内容的关键。
当我的文件结构中有多个文件以不同方式从不同位置引用时,我遇到了这个问题。例如:
C:\DataSource\files\samplefile.txt
C:\DataSource\data\samples\..\..\files\samplefile.txt
C:\DataSource\etc\..\files\samplefile.txt
这 3 个路径字符串都引用了磁盘上的同一个文件,但是它们的字符串表示形式不同。如果我将这些逐字逐句放入地图中,我会计算 3 次 samplefile.txt 的大小,我的估计会是错误的。
为了找到解决这个问题的方法,我希望 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 或其他库中的某个地方?
第二,我并不完全相信我编写的函数在所有情况下都能正常工作,我希望更多人关注它。它适用于我的测试。有人看到它会崩溃的情况吗?
【问题讨论】:
-
创建文件的“规范”路径的调用。请更改您的标题和您的问题以使用更常见的流行语。
-
一个可能产生的结果路径不一定指向与原始路径相同的文件系统对象的一种情况是,如果路径组件由于后面跟一个双精度而被删除-dot 实际上是指向另一个目录的链接。想象一下,如果在您的第三个示例中,C:\DataSource\etc 实际上是到 D:\tmp\someDir 的符号链接。如果您要将 C:\DataSource\etc\..\files\samplefile.txt 简化为 C:\DataSource\files\samplefile.txt,实际上可能不会参考同一个文件。但是你总是可以通过 boost::filesystem::is_symlink 来检查。
-
没关系,我才意识到这个问题是 6 年前提出的,而 boost::filesystem 现在有一个 canonical() 函数,它当时可能没有。
标签: boost path filesystems