POCO C++库学习和分析 -- 文件系统
既然作为一个框架性的库,自然会提供对于文件系统的操作。在Poco库中,封装了一些类去完成上述操作。这些类包括了:
1. Poco::Path
2. Poco::File
3. Poco::TemporaryFile
4. Poco::DirectoryIterator
5. Poco::Glob
这些类在实现上并没有什么特殊的注意点,主要是不同操作系统API的调用。如果想学习API函数的话,确实是一个不错的例子。在这里将主要介绍这些类的接口和使用,主要以翻译Poco的使用文档为主。
1. Poco::Path
1.1 路径:
1. 在不同操作系统中,指明文件和目录所在位置的标示符是不一样的。2. 标示符的不一致,会造成代码在不同平台之间移植的困难。
3. Poco::Path类抽象了不同标识符之间的区别,使程序员可以把注意力集中在业务的开发上。
4. Poco::Path类支持Windows、Unix、OpenVMS操作系统。
1.2 Poco路径简介:
Poco中的路径包括了:1. 一个可选的节点(node)名:
a) 在Windows上,这是计算机在UNC( Universal Naming Convention)路径中的名字
b) 在OpenVMS中,这代表一个集群系统中的节点名
c) 在Unix中,此名字未被使用。
2. 一个可选的设备(device)名:
a) 在Windows上,这是一个驱动器盘符
b) 在OpenVMS上,这是存储盘符的名字
c) 在Unix,此名字未被使用。
3. 一个目录名的列表
4. 一个文件名(包括扩展名)和版本号(OpenVMS特有)
Poco支持两种路径:
1. 绝对路径
以根目录为起点的描述资源的目录
2. 相对目录
以某一个确定路径为起点的描述资源的目录(通常这是用户的当前目录)
相对目录可以被转换为绝对目录(反之,并不成立)。
在Poco中路径的指向可以是一个目录也可以是一个文件。当路径指向目录时,文件名为空。
下面是Poco中关于路径的一些例子:
Path: C:\Windows\system32\cmd.exe
Style: Windows
Kind: absolute, to file
Node Name: –
Device Name: C
Directory List: Windows, system32
File Name: cmd.exe
File Version: –
Path: Poco\Foundation\
Style: Windows
Kind: relative, to directory
Node Name: –
Device Name: –
Directory List: Poco, Foundation
File Name: –
File Version: –
Path: \\www\site\index.html
Style: Windows
Kind: absolute, to file
Node Name: www
Device Name: –
Directory List: site
File Name: index.html
File Version: –
Path: /usr/local/include/Poco/Foundation.h
Style: Unix
Kind: absolute, to file
Node Name: –
Device Name: –
Directory List: usr, local, include, Poco
File Name: index.html
File Version: –
Path: ../bin/
Style: Unix
Kind: relative, to directory
Node Name: –
Device Name: –
Directory List: .., bin
File Name: –
File Version: –
Path: VMS001::DSK001:[POCO.INCLUDE.POCO]POCO.H;2
Style: OpenVMS
Kind: absolute, to file
Node Name: VMS001
Device Name: DSK001
Directory List: POCO, INCLUDE, POCO
File Name: POCO.H
File Version: 2
1.3 类说明
1. Poco::Path类在Poco库中代表了路径。2. Poco::Path类并不关心路径所指向的目标在文件系统中是否存在。这个工作由Poco::File类负责。
3. Poco::Path支持值语义(copy函数和赋值函数),但不支持关系操作符。
构建一个路径
构建一个路径存在着两种方式:
1. 从0开始构建,分别构建node、device、directory、file
2. 通过一个包含着路径的字符串去解析
在构建时,可以指定路径的格式:
a)PATH_UNIX
b)PATH_WINDOWS
c)PATH_VMS
d)PATH_NATIVE (根据当前系统格式判断)
e)PATH_GUESS (让Poco库自行判断)
从0构造路径
1. 创建一个空路径,使用默认的构造函数(默认情况下路径格式为"相对目录")或者构造时使用一个bool参数去指定路径格式(true = absolute, false = relative)
2. 如果需要的话,使用下列赋值函数去设置节点和设备名
void setNode(const std::string& node)
void setDevice(const std::string& device)
3. 添加路径名
void pushDirectory(const std::string& name)
4. 设置文件名
void setFileName(const std::string& name)