【C++】POCO学习总结(十一):文件系统(路径、文件属性、目录浏览、临时文件等)
【C++】郭老二博文之:C++目录
1、路径
1.1 路径说明
Window:
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:
Linux:
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:Foundation.h
File Version:
1.2 Poco::Path 表示路径
头文件:#include “Poco/Path.h”
Poco::Path并不关心它所包含的路径是否在文件系统中实际存在
1.3 组成路径的示例
#include "Poco/Path.h"
int main(int argc, char** argv)
{
Poco::Path p(true); // path will be absolute
p.setNode("VMS001");
p.setDevice("DSK001");
p.pushDirectory("POCO");
p.pushDirectory("INCLUDE");
p.pushDirectory("POCO");
p.setFileName("POCO.H");
std::string s(p.toString(Poco::Path::PATH_VMS));
// "VMS001::DSK001:[POCO.INCLUDE.POCO]POCO.H"
p.clear(); // start over with a clean state
p.pushDirectory("projects");
p.pushDirectory("poco");
s = p.toString(Poco::Path::PATH_WINDOWS); // "projects\poco\"
s = p.toString(Poco::Path::PATH_UNIX); // "projects/poco/"
s = p.toString(); // depends on your platform
return 0;
}
1.4 解析路径的示例
#include "Poco/Path.h"
using Poco::Path;
int main(int argc, char** argv)
{
Path p("c:\\projects\\poco\\build_vs80.cmd", Path::PATH_WINDOWS);
std::string device(p.getDevice()); // "c"
int n = p.depth(); // 2
std::string dir1(p.directory(0)); // "projects"
std::string dir2(p[1]); // "poco"
std::string fileName(p[2]); // "build_vs80.cmd"
fileName = p.getFileName();
std::string baseName(p.getBaseName()); // "build_vs80"
std::string extension(p.getExtension()); // "cmd"
p.setBaseName("build_vs71");
fileName = p.getFileName(); // "build_vs71.cmd"
return 0;
}
1.5 常用静态函数
Poco::Path提供静态方法来获取系统特定的特殊目录或文件的路径:
- std::string current()返回当前工作目录的路径
- std::string home()返回用户主目录的路径
- std::string temp()返回临时文件到系统目录的路径
- std::string null()返回系统空文件/设备的路径(例如,“/dev/null"或"NUL:”)
- bool find(const std::string& pathList, const std::string& name, path & path)
在pathList中指定的位置搜索具有给定名称的文件。
pathList中的路径必须由平台的路径分隔符分隔(Windows上为“;”,Unix上为“:”)。
如果在pathList中给出的位置之一找到文件,则文件的绝对路径存储在path中,并返回true。
否则,返回false, path保持不变。
2、Poco::File 文件
头文件:#include “Poco/File.h”
2.1 查询文件属性
- bool exists() const:如果文件存在返回true,否则返回false
- bool canRead() const:如果文件是可读的(用户有足够的权限从文件中读取)返回true,否则返回false
- bool canWrite() const:如果文件是可写的(用户有足够的权限写入文件)返回true,否则返回false
- bool canExecute() const:如果文件是可执行的返回true,否则返回false
- bool isFile() const:如果文件是普通文件(而不是目录或符号链接)则返回true,否则返回false
- bool isLink() const:如果文件是符号链接返回true,否则返回false
- bool isDirectory() const:如果文件是目录返回true,否则返回false
- bool isDevice() const:如果文件是设备文件返回true,否则返回false
- bool isHidden() const:如果文件具有隐藏属性(Windows),或者其名称以点开头(Unix),返回true
- Poco::Timestamp created() const:返回文件创建的日期和时间
- Poco::Timestamp getLastModified() const:返回文件被访问的日期和时间
- File::FileSize getSize() const:以字节为单位返回文件的大小,File::FileSize是一个无符号64位整数。
2.2 修改文件属性
- void setLastModified(Poco::Timestamp dateTime):设置文件的访问时间戳
- void setSize(FileSize newSize):以字节为单位设置文件的大小,例如截断文件
- void setWritable(bool flag = true):使文件可写(flag = true),或只读(flag = false)
- void setReadOnly(bool flag = true):与setWritable(!flag)相同
2.3 重命名、复制、删除、创建
- void copyTo(const std::string& path) const :文件复制到给定的路径(可以是目录)
- void moveTo(const std::string& path) const:将文件复制到给定的路径(可以是一个目录),然后删除原始文件
- void renameTo(const std::string& path):重命名文件
- void remove(bool recursive = false):删除文件。如果文件是一个目录且recursive = true,则递归删除该目录下的所有文件和子目录。
- bool createFile():在原子操作中创建一个新的空文件。如果文件已经创建,则返回true;如果文件已经存在,则返回false。如果创建失败,抛出Poco::FileException。
- bool createDirectory():如果创建成功,则返回true;如果目录已经存在,则返回false。如果创建失败(例如,如果父目录不存在),则抛出一个异常Poco::FileException。
- void createDirectories():创建一个目录,以及所有需要的父目录
2.4 读目录中的文件
void list(std::vectorstd::string& files) const
void list(std::vector& files) const
3、Poco::DirectoryIterator 目录迭代器
Poco::DirectoryIterator提供一个迭代器风格的接口,用于读取目录的内容。
头文件:#include “Poco/DirectoryIterator.h”
Poco::DirectoryIterator中维护一个Poco::File和一个绝对路径Poco::Path。
#include "Poco/DirectoryIterator.h"
#include <iostream>
using Poco::DirectoryIterator;
using Poco::Path;
int main(int argc, char** argv)
{
std::string cwd(Path::current());
DirectoryIterator it(cwd);
DirectoryIterator end;
while (it != end)
{
std::cout << it.name();
if (it->isFile())
std::cout << it->getSize();
std::cout << std::endl;
Path p(it.path());
++it;
}
return 0;
}
4、模式匹配
Poco::Glob,在模式中:
- '*'匹配任何字符序列
- '?'匹配任意单个字符
- [SET]匹配指定集合中的任意单个字符
- [!SET]匹配不属于指定字符集的任何单个字符
- [123]匹配数字1、2或3
- [a-zA-Z]匹配任何小写或大写字母
- 特殊字符可以用反斜杠转义。
bool match(const std::string& subject):如果subject中的路径与Glob的模式匹配,则返回true,否则返回false。
#include <iostream>
using Poco::Glob;
int main(int argc, char** argv)
{
std::set<std::string> files;
Glob::glob("%WINDIR%\\system32\\*.exe", files);
// Glob::glob("/usr/include/*/*.h", files);
std::set<std::string>::iterator it = files.begin();
for (; it != files.end(); ++it)
{
std::cout << *it << std::endl;
}
return 0;
}
5、Poco::TemporaryFile 临时文件
5.1 说明
许多程序需要临时文件,其特征如下:
- 在一个特殊的系统特定目录(例如,Unix系统上的"/tmp/")中创建一个临时文件。
- 临时文件具有自动生成的唯一名称
- 当临时文件不再使用时,必须删除临时文件
Poco::TemporaryFile派生自Poco::File。构造函数自动创建一个唯一的文件名,放在系统特定的临时文件目录中。文件本身没有被创建。如果文件已经创建,析构函数将删除该文件。或者,删除可以推迟到程序终止,或者不删除。
5.2 使用
- void keep():禁止析构函数自动删除文件
- void keepUntilExit():禁用析构函数自动删除文件,并在程序终止时注册该文件以进行删除
- static void registerForDeletion(const std::string& path):注册一个文件以便在程序终止时自动删除
- static std::string tempName()为临时文件创建一个唯一的路径名
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!