POCO C++库学习和分析 -- 文件系统

2023-05-16

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)

               下面是一个例子:
#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. Poco支持从一个字符串中解析路径名
                              Path(const std::string& path)
                              Path(const std::string& path, Style style)
               如果函数调用时,路径格式style不被指定,将使用当前系统路径格式。
               2. 可以从另一个路径(指向目录名)和文件名,或者两个路径(第一个为绝对路径,第二个为相对路径)构造
                              Path(const Path& parent, const std::string& fileName)
                              Path(const Path& parent, const Path& relative)

               路径也可以通过下列函数去构建
                              Path& assign(const std::string& path)
                              Path& parse(const std::string& path)
                              Path& assign(const std::string& path, Style style)
                              Path& parse(const std::string& path, Style style)

               如果路径非法的话,会抛出Poco::PathSyntaxException异常。想要测试一个路径字符串是否合法,可以使用tryParse()函数:
                              bool tryParse(const std::string& path)
                              bool tryParse(const std::string& path, Style style)

               下面是一个例子:
#include "Poco/Path.h"
using Poco::Path;
int main(int argc, char** argv)
{
	//creating a path will work independent of the OS
	Path p("C:\\Windows\\system32\\cmd.exe");
	Path p("/bin/sh");
	p = "projects\\poco";
	p = "projects/poco";
	p.parse("/usr/include/stdio.h", Path::PATH_UNIX);
	bool ok = p.tryParse("/usr/*/stdio.h");
	ok = p.tryParse("/usr/include/stdio.h", Path::PATH_UNIX);
	ok = p.tryParse("/usr/include/stdio.h", Path::PATH_WINDOWS);
	ok = p.tryParse("DSK$PROJ:[POCO]BUILD.COM", Path::PATH_GUESS);
	return 0;
}

               Poco::Path类提供了函数用于转换成为字符串:
               std::string toString()
               std::string toString(Style style)
               当然也可以使用下列函数得到路径不同部分的字符串:
              const std::string& getNode()
              const std::string& getDevice()
              const std::string& directory(int n) (also operator [])
              const std::string& getFileName()
               可以调用下列函数获取目录的深度:
               int depth() const

               通过下面的函数可以得到和设置文件的基本名和扩展名:
                              std::string getBaseName() const
                              void setBaseName(const std::string& baseName)
                              std::string getExtension() const
                              void setExtension(const std::string& extension)

               下面是一个例子:
#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. Path& makeDirectory()
               确保路径的结尾是一个目录名。如果原路径有文件名存在的话,添加一个与文件名同名的目录,并清除文件名。
               2. Path& makeFile()
               确保路径的结尾是一个文件名。如果原路径是一个目录名,则把最后一个目录名变成文件名,并去除最后一个目录名。
               3. Path& makeParent()
                   Path parent() const
               使路径指向它的父目录(如果存在文件名的话,清除文件名;否则的话则移除最后一个目录名)
               4. Path& makeAbsolute()
                   Path& makeAbsolute(const Path& base)
                   Path absolute() const
                   Path absolute(const Path& base)
               转换相对路径为绝对路径
               5. Path& append(const Path& path)
               添加路径
               6. Path& resolve(const Path& path)
               如果新的路径为绝对路径,则代替现有的路径;否则则在原路径下追加

               路径属性:
               1. bool isAbsolute() const
               如果路径为绝对路径,返回true;否则为false
               2. bool isRelative() const
               如果路径为相对路径,返回true;否则为false
               3. bool isDirectory() const
               如果路径为目录,返回true;否则为false
               4. bool isFile() const
               如果路径为文件,返回true;否则为false


               下面是一个例子:
#include "Poco/Path.h"
using Poco::Path;
int main(int argc, char** argv)
{
	Path p("/usr/include/stdio.h", Path::PATH_UNIX);
	Path parent(p.parent());
	std::string s(parent.toString(Path::PATH_UNIX)); // "/usr/include/"
	Path p1("stdlib.h");
	Path p2("/opt/Poco/include/Poco.h", Path::PATH_UNIX);
	p.resolve(p1);
	s = p.toString(Path::PATH_UNIX); // "/usr/include/stdlib.h"
	p.resolve(p2);
	s = p.toString(Path::PATH_UNIX); // "/opt/Poco/include/Poco.h"
	return 0;
}


               特殊的目录和文件
               Poco::Path提供了静态函数,用于获取系统中的一些特殊目录和文件
               1. std::string current()
               返回当前的工作目录
               2. std::string home()
               返回用户的主目录
               3. std::string temp()
               返回操作系统的零时目录
               4. std::string null()
               返回系统的空目录(e.g., "/dev/null" or "NUL:")

               下面是一个例子:
#include "Poco/Path.h"
#include <iostream>
using Poco::Path;
int main(int argc, char** argv)
{
	std::cout
		<< "cwd: " << Path::current() << std::endl
		<< "home: " << Path::home() << std::endl
		<< "temp: " << Path::temp() << std::endl
		<< "null: " << Path::null() << std::endl;
	return 0;
}

               路径和环境变量
               在配置文件中的路径经常包含了环境变量。在传递此类路径给Poco::Path之间必须对路径进行扩展。
               对包含环境变量的路径扩展可以使用如下函数
                               std::string expand(const std::string& path)
               函数会返回一个对环境变量进行扩充后的路径名。环境变量的格式会根据操作系统有所不同。(e.g., $VAR on Unix, %VAR% on Windows).在Unix上,同样会扩展"~/"为当前用户的主目录。

               下面是一个例子:
#include "Poco/Path.h"
using Poco::Path;
int main(int argc, char** argv)
{
	std::string config("%HOMEDRIVE%%HOMEPATH%\\config.ini");
	// std::string config("$HOME/config.ini");
	std::string expConfig(Path::expand(config));
	return 0;
}

               文件系统主目录:

               void listRoots(std::vector<std::string>& roots)
               会用所有挂载到文件系统的根目录来填充字符串数组。在windows上,为所有的驱动盘符。在OpenVMS上,是所有挂载的磁盘。在Unix上,为"/"。

               查询文件:
               bool find(const std::string& pathList, const std::string& name, Path& path)
               在指定的目录集(pathList)中搜索指定名称的文件(name)。pathList参数中如果指定了多个查找目录,目录之间必须使用分割符 (Windows平台上为";" , Unix平台上为":")。参数name中可以包含相对路径。如果文件在pathList指定的目录集中存在,找到文件的绝对路径会被放入path参数中,并且函数返回true,否则函数返回false,并且path不改变。
               这个函数也存在一个使用字符串向量,而不是路径列表的迭代器的变体。定义如下:
               bool find(StringVec::const_iterator it, StringVec::const_iterator end, const std::string& name, Path& path)

               下面是一个例子:
#include "Poco/Path.h"
#include "Poco/Environment.h"
using Poco::Path;
using Poco::Environment;
int main(int argc, char** argv)
{
	std::string shellName("cmd.exe"); // Windows
	// std::string shellName("sh"); // Unix
	std::string path(Environment::get("PATH"));
	Path shellPath;
	bool found = Path::find(path, shellName, shellPath);
	std::string s(shellPath.toString());
	return 0;
}


2. Poco::File

               同文件协同工作
               1. Poco仅支持与文件元数据协同工作。想要操作文件中的真实数据,需要使用标准库的文件流。
               2. 使用Poco库,你可以查出一个文件或者目录是否存在,是否可读或可写,文件何时创建和被修改,文件大小等信息。
               3. 通过Poco库,也可以修改文件属性,重命名文件,拷贝文件和删除文件。
               4. 通过Poco库,可以创建空文件(原子操作)和目录。

               所有同文件操作相关操作被定义于Poco::File中。为了创建一个Poco::File对象,需要提供一个路径作为参数。这个路径可以使用Poco::Path类,也可以是一个字符串。同时Poco::File也支持创建一个空对象,在稍后的操作中再设置路径。
               Poco::File支持所有的值语义,也支持所有的关系操作符 (==, !=, <, <=, >, >=)。关系操作符的结果是通过进行简单的文件路径比较而得到的。

                查询文件属性:
               1. bool exists() const
               如果文件存在返回true,否则为false
               2. bool canRead() const
               如果文件可读(用户对文件拥有足够权限)返回true,否则为false
               3. bool canWrite() const
               如果文件可写(用户对文件拥有足够权限)返回true,否则为false
               4. bool canExecute() const
               如果文件是可执行文件,返回true,否则为false
               5. bool isFile() const
               如果文件是常规文件(即不是目录或符号链接)返回为真,否则为false
               6. bool isLink() const
               如果文件是符号链接,返回为真,否则为false
               7. bool isDirectory() const
               如果文件是目录,返回为真,否则为false
               8. bool isDevice() const
               如果文件是设备,返回为真,否则为false
               9. bool isHidden() const
               如果文件属性为隐藏,返回为真,否则为false。(在Windows上文件属性为隐藏;Unit上使用"."开头的文件)
               10. Poco::Timestamp created() const
               返回文件创建的日期和时间
               11. Poco::Timestamp getLastModified() const
               返回最后访问文件的时间和日期
               12. File::FileSize getSize() const
               返回文件大小(单位为字节)。在大多数系统中,File::FileSize被定义成一个unsigned 64-bit整数。

               修改文件属性
               1. void setLastModified(Poco::Timestamp dateTime)
               设置最后访问文件的时间
               2. void setSize(FileSize newSize)
               设置文件大小(单位为字节)。可用于截断一个文件。
               3. void setWritable(bool flag = true)
               如果flag == true,使文件可写;flag == false相当于文件只读
               4. void setReadOnly(bool flag)
               同setWritable(!flag)作用相同

               重命名,拷贝和删除
               1. void copyTo(const std::string& path) const
               拷贝文件至指定目录(通常是个文件夹)
               2. void moveTo(const std::string& path) const
               拷贝文件至指定目录(通常是个文件夹)并且删除源文件
               3. void renameTo(const std::string& path)
               重命名文件
               4. void remove(bool recursive = false)
               删除文件。如果文件是个目录,并且recursive == true,则递归的删除所有文件和子目录。
               
               创建文件和目录
               1. bool createFile()
               使用原子操作创建一个新的空文件。如果文件被创建返回true,如果文件已存在返回false。如果创建失败,抛出Poco::FileException异常。
               2. bool createDirectory()
               创建一个新目录。如果目录被创建,返回true,如果目录已存在,返回false。如果创建失败,抛出Poco::FileException(比如说父目录不存在)。
               3. void createDirectories()
               创建目录集。当父目录不存在时,也会同时创建父目录。

               读取目录
               1. void list(std::vector<std::string>& files) const
                   void list(std::vector<File>& files) const
               会把目录中所有的文件名填入给定的files数组。在其内部,会使用Poco::DirectoryIterator遍历目录

               下面是一个例子:
#include "Poco/File.h"
#include "Poco/Path.h"
#include <iostream>
using Poco::File;
using Poco::Path;
int main(int argc, char** argv)
{
	std::string tmpPath(Path::temp());
	tmpPath.pushDirectory("PocoFileSample");
	File tmpDir(tmpPath);
	tmpDir.createDirectories();
	bool exists = tmpDir.exists();
	bool isFile = tmpDir.isFile();
	bool isDir = tmpDir.isDirectory();
	bool canRead = tmpDir.canRead();
	bool canWrite = tmpDir.canWrite();
	File tmpFile(Path(tmpPath, std::string("PocoFileSample.dat")));
	if (tmpFile.createFile())
	{
		tmpFile.setSize(10000);
		File tmpFile2(Path(tmpPath, std::string("PocoFileSample2.dat")));
		tmpFile.copyTo(tmpFile2.path());
		Poco::Timestamp now;
		tmpFile.setLastModified(now);
		tmpFile.setReadOnly();
		canWrite = tmpFile.canWrite();
		tmpFile.setWriteable();
		canWrite = tmpFile.canWrite();
	}
	std::vector<std::string> files;
	tmpDir.list(files);
	std::vector<std::string>::iterator it = files.begin();
	for (; it != files.end(); ++it)
	{
		std::cout << *it << std::endl;
	}
	tmpDir.remove(true);
	return 0;
}

3. DirectoryIterator类

               Poco::DirectoryIterator类为读取目录中的内容提供了一个迭代子风格的接口。
               Poco::DirectoryIterator使用时有如下限制:
               1. 仅支持前向迭代操作(forward iteration (++))
               2. 当一个迭代子拷贝自另一个迭代子时,总是指向源迭代子的曾经指向的文件。即使源迭代子已经指向另外一个文件。
               3. 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. Glob类

               Poco::Glob支持同Unix shells类似的通配符匹配。'*'匹配任何字符串序列,'?'匹配任意单一文件,[SET]匹配任意存在于指定字符集中的单一字符,[!SET]匹配任何不存在于指定字符集中的单一字符。[SET]可以指定字符集的范围和锁包含的字符。例如[123]用来匹配数字1,2,3;[a-zA-Z]匹配任何大写或小写英文字符。Glob类支持用一个反斜杠转义的特殊字符。
               Poco::Glob可以使用一个pattern,或者一个选项的标志位去创建。GLOB_DOT_SPECIAL选项适用于Unix隐藏文件。

               内部函数:
               1. bool match(const std::string& subject)
               如果subject对应的路径符合匹配规则,返回true,否则为false
               2. void glob(const std::string& pattern, std::set<std::string>& files, int options = 0)
               void glob(const Path& pattern, std::set<std::string>& files, int options = 0)
               用符合给定pattern的所有文件填充给定的set集

               下面是一个例子:
#include "Poco/Glob.h"
#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. 临时文件

               写程序时,有时候需要用到临时文件,临时文件的使用有一下特点:
               1. 临时文件只在指定的目录被创建。如Unix系统上的"/tmp/"目录
               2. 临时文件会自动生成唯一名字
               3. 临时文件在不再被使用时,需要被删除

               Poco::TemporaryFile中也提供了一个类来实现此功能。

5.1 Poco::TemporaryFile类

               1. Poco::TemporaryFile继承自Poco::File
               2. 构造函数会为临时文件自动生成一个唯一的文件名,以及放置临时文件的操作系统默认目录。当然文件本身并未被创建。
               3. 如果临时文件被创建,析构函数会删除该文件
               4. 二选一的,删除动作可以被延迟到程序结束或者不再被使用。
               5. 任何文件都可以被延迟到程序终止时才被删除。

               成员函数:
               1. void keep()
               停止析构函数中删除文件的动作
               2. void keepUntilExit()
               停止析构函数中删除文件的动作,并注册该文件,延迟到程序结束时删除
               3. static void registerForDeletion(const std::string& path)
               注册文件,使之在程序结束时删除
               4. static std::string tempName()
               为临时文件创建一个唯一的名字

               下面是一个例子:
#include "Poco/TemporaryFile.h"
#include <fstream>
using Poco::TemporaryFile;
int main(int argc, char** argv)
{
	TemporaryFile tmp;
	std::ofstream ostr(tmp.path().c_str());
	ostr << "Hello, world!" << std::endl;
	ostr.close();
	return 0;
}



(版权所有,转载时请注明作者和出处   http://blog.csdn.net/arau_sh/article/details/8698448)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POCO C++库学习和分析 -- 文件系统 的相关文章

  • 为什么有人劝别选计算机专业?

    大家好 xff0c 我是程序员吴师兄 xff0c 一个坚持在 CSDN 日更原创的程序员 今天想和大家聊一聊为什么有人劝别选计算机专业 和大家说一句掏心窝的话 xff1a 直到 2021 年 xff0c 计算机专业依旧是寒门改变命运的一个最
  • 看完谷歌大佬的 LeetCode 刷题笔记,我马上去字节跳动面试!

    如果你刷 LeetCode 觉得吃力 那么一定需要这份谷歌大佬的 LeetCode 刷题笔记 微信搜索 五分钟学算法 xff0c 公众号回复 04 即可获取对应的下载链接 xff0c 以下是详细介绍 在这里推荐一个谷歌大佬的刷题笔记 每一道
  • 剑指 Offer 09. 用两个栈实现队列(视频讲解)

    一 题目描述 用两个栈实现一个队列 队列的声明如下 xff0c 请实现它的两个函数 appendTail 和 deleteHead xff0c 分别完成在队列尾部插入整数和在队列头部删除整数的功能 若队列中没有元素 xff0c delete
  • 刷到 LeetCode 这个评论,被笑到了

    大家好 xff0c 我是吴师兄 今天早上我在 LeetCode 第 141 号问题 环形链表 的评论区中发现了一个称得上是天秀的解法 xff0c 简直太骚气了 xff0c 忍不住分享给大家 首先给没有见过这道题目的小伙伴补充一下前置知识 x
  • Android JNI基础篇(一)

    Android JNI 基础篇 前言 JNI学习其实并不难 xff0c 在这里 xff0c 我将引导大家学习JNI的基础知识 xff0c 认真学完本教程 xff0c 你将更加坚信我说的话 来吧 xff0c 我们一起学习 xff01 JNI
  • ROS学习(三):消息通信过程

    主节点管理节点信息 xff0c 每个节点根据需要与其他节点进行连接和消息通信 在这里 xff0c 我们来看看最重要的主节点 节点 话题 服务和动作信息的过程 一 运行主节点 节点之间的消息通信当中 xff0c 管理连接信息的主节点是为使用R
  • HTTP Digest authentication(摘要认证)和HTTP basic Authorization(普通认证)用户登出注销的方法

    最近项目中需要对普通认证HTTP basic Authorization和摘要认证HTTP Digest authenticatio登录进行注销 搜索到有几篇文章号称ie xff0c Firefox chrome都可以可以注销 xff0c
  • POCO C++库学习和分析 -- 序

    POCO C 43 43 库学习和分析 序 1 POCO库概述 xff1a POCO是一个C 43 43 的开源库集 同一般的C 43 43 库相比 xff0c POCO的特点是提供了整一个应用框架 如果要做C 43 43 程序应用框架的快
  • 【ubuntu18+QT12+OpenCV4环境配置】

    ubuntu18 43 QT12 43 OpenCV4环境配置 前些天编译了最新版本opencv4 xff0c 但是电脑内还有个opencv3 2 xff0c 有时候二者共享链接库文件即libopencv so XX xff0c 之类的路径
  • Ubuntu无法使用浏览器上网

    1 可以更新一下浏览器 xff0c 打开终端 xff0c 输入 xff1a sudo apt get install firefox 如果你用的是其他浏览器可以吧后面的 firefox 改为其他浏览器 xff0c 如谷歌浏览器 xff1a
  • 浅析C++中struct和class的区别

    文章目录 C和C 43 43 中struct的区别C 43 43 中struct和class的区别 C和C 43 43 中struct的区别 struct最早是在C语言中出现的 xff0c 但在C语言中struct只是一种 用户自定义数据类
  • C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

    本文可解决的问题 在一个头文件 h中定义一个结构体 在另一个 h文件中使用这个结构体引发错误C2143 语法错误 缺少 在 的前面 编译源文件 等莫名的报错头文件的交叉包含 即头文件a包含了头文件b 头文件b又包含了头文件a多个不同的头文件
  • 使用python进行http请求自动登录处理302跳转的问题

    一 问题背景 最近在做一个自动化业务处理的程序时 xff0c 需要完成对系统的自动登录 经过抓包测试只需要使用简单的post请求后收到的回包中包含cookie信息 xff0c 因此可以据此完成登录 程序设计思路为发送求到登录验证页面 xff
  • C# TCP/UDP网络通讯调试助手(含源码)

    C TCP UDP网络通讯调试助手 1 客户端界面 1 客户端界面 源码下载地址 xff1a https download csdn net download kingleitao 11927885
  • socketcan

    参考 lt lt Linux Can编程详解 gt gt CAN原理介绍 https www cnblogs com spoorer p 6649303 html 一 初始化工作 SocketCAN 中大部分的数据结构和函数在头文件 lin
  • vscode+cmake 实现C++项目的完整编译

    1 项目目录 span class token builtin class name span bin build CMakeLists txt include array 2d h common h swap h lib src arra
  • 航模常用硅胶线、热缩管规格

    一般穿越机中信号线等用26或28awg xff0c 外径1 3 1 5mm xff0c 配套热缩管选用2mm的比较合适 供电电源线一般用10awg或12awg xff0c 外径4 5 5 4mm xff0c 配套热缩管为7mm比较合适 14
  • POCO C++库学习和分析 -- 线程 (一)

    POCO C 43 43 库学习和分析 线程 xff08 一 xff09 线程是程序设计中用的非常多的技术 xff0c 在UI设计 xff0c 网络通讯设计中广泛使用 在POCO库中 xff0c 线程模块可以分成6个部分去理解 锁 xff0
  • 100条经典C语言笔试题目

    100 条经典C语言笔试题目 题目来源 xff1a 1 中兴 华为 慧通 英华达 微软亚洲技术中心等中 外企业面试题目 xff1b 2 C 语言面试宝典 林锐 高质量编程第三版 说明 xff1a 1 部分C 语言面试题中可能会参杂部分和C
  • hadoop2.7完全分布式集群搭建以及任务测试

    要想深入的学习hadoop数据分析技术 xff0c 首要的任务是必须要将hadoop集群环境搭建起来 xff0c 本文主要讲述如何搭建一套hadoop完全分布式集群环境 环境配置 xff1a 2台64位的redhat6 5 43 1台64位

随机推荐

  • /etc/passwd, /etc/shadow

    使用者帐号 xff1a etc passwd etc shadow 由上面的说明您大概已经知道 xff0c 嘿嘿 xff01 帐号管理最重要的两个档案就是 etc passwd 与 etc shadow 了 xff01 这两个档案可以说是
  • 密集负载下的网卡中断负载均衡smp affinity及单队列RPS

    简单的说就是 xff0c 每个硬件设备 xff08 如 xff1a 硬盘 网卡等 xff09 都需要和 CPU 有某种形式的通信以便 CPU 及时知道发生了什么事情 xff0c 这样 CPU 可能就会放下手中的事情去处理应急事件 xff0c
  • 基于stm32f103zet6之最小系统的制作

    因为嵌入式老师一直鼓励我们去学习stm32 xff0c 他说这是一款很不错的片子 xff0c 所以就萌生了学习stm32的念头 xff0c 之前一直在学习基于arm11的OK6410 xff0c 裸机跑到触摸屏就没有再继续了 xff0c 感
  • 基于stm32f103zet6的DS1302学习

    由于硬件出了问题 xff0c 也就是外部低速晶振没用 xff0c 震不起来 xff0c 然后查看了网上的帖子 xff0c STM32的RTC果然口碑不怎么样 xff0c 所以果断换DS1302 xff0c 在移植的过程中还算顺利 xff0c
  • 基于stm32f103zet6之使用FSMC驱动TFT的学习

    在完成IO驱动彩屏的试验后 xff0c 就准备着手使用FSMC来驱动彩屏 xff0c 先了解一下预备知识 一 所谓的FSMC机制 简单介绍FSMC在这篇博文里面很清楚 xff0c 推荐一下 http blog csdn net king b
  • (转)ds18b20时序说明

    ds18b20时序说明 新手在DS18B20读写过程中要犯很多错误 老衲普度众生 xff0c 简要说明它怎么用 1 过程1 2是初始化过程 xff0c 每次读取都要初始化 xff0c 否则18b20处于待机状态 xff0c 无法成功读取 过
  • H桥驱动芯片IR2110功能简介

    1 1 驱动芯片IR2110功能简介 在功率变换装置中 xff0c 根据主电路的结构 xff0c 起功率开关器件一般采用直接驱动和隔离驱动两种方式 美国IR公司生产的IR2110驱动器 xff0c 兼有光耦隔离和电磁隔离的优点 xff0c
  • 关于示波器是否必须要接地线的疑问

    这是一个非常隐蔽的问题 xff0c 稍不注意 xff0c 在接入示波器时 xff0c 就会导致线路板上的某些芯片突然爆炸 xff0c 不仅会对项目产生非常大的影响 xff0c 也足以让我们着实郁闷上几天 所以 xff0c 应该足够引起电路设
  • POCO C++库学习和分析 -- 进程

    POCO C 43 43 库学习和分析 进程 Poco Foundation库中涉及进程的内容主要包括了4个主题 xff0c 分别是进程 Process 进程间同步 xff08 inter process synchronization x
  • Mysql安装后在服务里找不到和服务启动不起来的解决方法

    一 安装完MySQL后找不到服务 在那完MySQL数据库后 xff0c 在计算机管理 61 61 服务和应用程序 61 61 服务中找不到MySQL的服务 解决方法 xff1a 1 以管理员的身份运行cmd或者Windows powersh
  • C++中虚继承

    一 虚继承和虚基类 1 多继承产生的冲突 在C 43 43 中多继承时很容易产生命名冲突 xff0c 即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字 xff0c 命名冲突依然有可能发生 xff0c 比如典型的是菱形继承 x
  • 跨平台C++单元测试框架——GTest

    1 简介 GTest是google公司发布的一个跨平台的 Liunx Mac OS X Windows Cygwin Windows CE and Symbian C 43 43 单元测试框架 它提供了丰富的断言 致命和非致命判断 参数化
  • 音频格式之AAC(高级音频编码技术)

    1 简介 ACC xff08 Advanced Audio Coding xff0c 高级音频编码 xff09 是杜比实验室为音乐社区提供的技术 xff0c 出现于1997年 xff0c 基于MPEG 2的音频编码技术 2000年 xff0
  • C++11之lambda回调设置与应用

    在程序中有时候我们需要实现回调效果 xff0c 比如先设置监听 xff0c 然后在后面具体执行完某个操作后再将该操作的结果通知给前面监听中 这种机制实际很常用 xff0c 比如window底下的消息机制 xff0c Qt中的信号槽的机制都有
  • 高速的C/C++编译工具——ccache

    1 简介 ccache xff08 compiler cache 的缩写 xff09 是一个编译器缓存 xff0c 该工具会高速缓存编译生成的信息 xff0c 并在编译的特定部分使用高速缓存的信息 xff0c 比如头文件 xff0c 这样就
  • Django17:内建用户系统

    1 定义 Django带有一个用户认证系统 它处理用户账号 组 权限以及基于cookie的用户会话 用户可以直接是使用Django自带的用户表 2 基本字段 模型类位置from django contrib contrib auth mod
  • Django18:文件上传

    1 上传规范 xff08 1 xff09 前端HTML 文件上传必须为POST提交方式 表达 lt form gt 中文件上传时必须带有enctype 61 multipart formdata 时才会包含文件内容数据 表单中用 lt in
  • Django19:发送邮件

    1 邮件相关协议 xff08 1 xff09 SMTP SMTP xff08 Simple Mail Transfer Protocol xff09 xff0c 简单邮件传输协议 xff08 25号端口 xff09 它是一组用于从原地址到目
  • JsonCpp的基本用法

    1 JsonCpp C 43 43 库 xff0c 允许操作JSON值 xff0c 包括与字符串串行化和序列化 它可在反序列化 序列化步骤中保留现有注释 xff0c 使其成为存储用户输入文件的便捷方式 是一个第三方JSON解析库 xff0c
  • POCO C++库学习和分析 -- 文件系统

    POCO C 43 43 库学习和分析 文件系统 既然作为一个框架性的库 xff0c 自然会提供对于文件系统的操作 在Poco库中 xff0c 封装了一些类去完成上述操作 这些类包括了 xff1a 1 Poco Path 2 Poco Fi