700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 26.菊花厂员工泄密事件(Qt5文件及磁盘处理)--- OpenCV从零开始到图像(人脸 + 物体)识别系列

26.菊花厂员工泄密事件(Qt5文件及磁盘处理)--- OpenCV从零开始到图像(人脸 + 物体)识别系列

时间:2024-07-10 18:24:43

相关推荐

26.菊花厂员工泄密事件(Qt5文件及磁盘处理)--- OpenCV从零开始到图像(人脸 + 物体)识别系列

本文作者:小嗷

微信公众号:aoxiaoji

吹比QQ群:736854977

简书链接:/u/45da1fbce7d0

本信息都来源与网络公开内容。如有疑问,如有不实。请立即通知小嗷,立即删除,有关言论。

本文你会找到以下问题的答案:

QT读写文件(后台搞个僵尸进程获取你在离线下操作,写入某文本)int16 int32 int64区别sizeof用法总结C++中的foreach用法文件大小及路径获取实例(监控你的某目录的变化,获取某文本绝对路径)文件系统浏览实例(自定义一个文件浏览窗口并获取当前目录路径)【实时获取当前目录路径。如果菊花厂网络部门这么做,一/文件三个月清理一次,数据文件大不大我不知道。但是,以社会经验来看网络部门居心不轨】

获取文件信息(小嗷感觉这才是关键,通过文件信息来判断,你几时打开文件【除去没用的进程exe,以一天为单位,读取你对ppt,execel,word等打开关闭文件的信息】)

当然,说到这里。大家和小嗷一样早就有对策,知己知彼,才能攻防胜利。(愿意分享自己的对策,可以和小嗷交流一下心得【没经本人同意小嗷,嘴巴严实】)

2.1 QT读写文件

不仅是菊花厂绝大部分公司所有计算机都安装后台监控软件,监控操作行为。

那么在不联网的情况下,它们是怎么监控计算机你们是否窃密(提前没有任何外部接口)?

你们可能问没有外部接口怎么窃密?就说最简单拍照或者脑子记住。

N年前菊花厂某些员工就是这样被抓。

小嗷根据自己多年的社会经验出发,不联网的情况下,那么后台一定生成一份类似文件读写你们的对公司电脑的操作。(请记住小嗷的一句话:不同的系统,不同的语言,同样的套路)

QFile:提供了读写文件的接口(可以读写文本文件,二进制文件和Qt的资源文件。)QTextStream:处理文本文件QDataStream:处理二进制文件QTemporaryFile:处理临时文件QFileInfo:获取文件信息QDir:处理目录QFileSystemWatcher:监视文件和目录变化

首先介绍QFile类读写文本文件

2.1.1 QFile类读写文本文件

(1)新建一个控制台项目(文件名称TextFile,一直下一步,Next)

代码如下:

#include <QCoreApplication>#include <QFile>#include <QtDebug>/** 打开一个文件有两种方式。一种方式是在构造函数中指文件名;另一种方式是使用setFileName()函数设置文件名。** 打开文件使用open()函数,关闭文件使用close()函数。此处的open()函数以只读方式打开文件,只读方式参数为* QIODevice::ReadOnly,只写方式参数为QIODevice::WriteOnly,读写参数为QIODevice::ReadWrite。** qint64 lineLen = file.readLine(buffer, sizeof(buffer)):在QFile中可以使用从QIODevice中继* 承的readLine()函数读取文件中的一行。** if(LineLen != -1){qDebug() << buffer}:如果读取成功,则readLine()函数返回实际读取的字节数;如果* 读取失败,则返回“-1”**/int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QFile file("textFile1.txt");if(file.open (QIODevice::ReadOnly)){char buffer[1024];qint64 LineLen = file.readLine (buffer, sizeof(buffer));if(LineLen != -1){qDebug() << buffer;}}file.close ();return a.exec();}

效果图

2.1.2 QTextStream类读写文本

QTextStream提供了更为方便的接口来读写文本,它可以操作QIODevice、QByteArray和QString。使用QTextStream的流操作符,可以方便地读写单词、行和数字。

为了产生文本,QTextStream还提供了填充、对齐和数字格式化的选项。

#include <QCoreApplication>#include <QFile>#include <QTextStream>/** 将内容写入到文件中** if(data.open(QFile::WriteOnly | QFile::Truncate))表示将原来文件中的内容清空。输出时将格式设为左对齐,占10个* 字符位置。** out << QObject::tr ("score:") << qSetFileWidth(10) << left << 90 <<endl:用户使用格式化函数和流操作符设* 置需要的输出格式。其中,qSetFieldWidth ()函数是设置字宽度的格式化函数。除此之外,QTextStream还提供了其他一些格式* 化函数*/int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QFile data("D://AAA---OPenCV/xiaoao.txt");if(data.open(QFile::WriteOnly|QFile::Truncate)){QTextStream out(&data);out<<QObject::tr("score:")<<qSetFieldWidth(10)<<left<<90<<endl;}return a.exec();}

效果图:

2.1.2.1 QTextStream的格式化函数

2.1.2.2 QTextStream的流操作符

2.1.3 读写二进制文件

QDateStream类提供了将二进制文件串行化的功能,用于实现C++基本类数据类型,如char,short,int,char*等的串行化。更复杂的串行化操作则是通过将数据分解为基本类型完成的。

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow{Q_OBJECTpublic:MainWindow(QWidget *parent = 0);~MainWindow();//创建一个公共函数filefunvoid filefun();};

mainwindow.cpp

//在主函数中调用filefun#include "mainwindow.h"#include <QFile>#include <QtDebug>#include <QDataStream>#include <QDate>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent){filefun ();}MainWindow::~MainWindow(){}void MainWindow::filefun (){/*将二进制数据写到数据流*/QFile file("binary.dat");file.open (QFile::WriteOnly | QFile::Truncate);QDataStream out(&file); //将数据序列化out << QString(tr("张卫东:")); //将字符串序列化out << QDate::fromString ("1990/04/01", "yyyy/MM/dd"); //讲整数序列化out << (qint32)25;file.close ();/*从文件中读取数据*/file.setFileName ("binary.dat");if(!file.open (QFile::ReadOnly)){qDebug() << "error" << endl;return;}QDataStream in(&file);QString name;QDate birthday;qint32 age;in >> name >> birthday >> age;//将获取字符串和整数qDebug() << name << birthday << age;file.close ();}

运行效果:

为啥出现文件出现乱码?因为输入的数是二进制数据,只有用二进制编码打开,才不会出现乱码。(要是我是MIS,我就会采用这方法存取数据)

2.1.3.1 int16 int32 int64区别

int16=short; int32=int;int64=long;

Int16 值类型表示值介于 -32768 到 +32767 之间的有符号整数。

Int32 值类型表示值介于 -2,147,483,648 到 +2,147,483,647 之间的有符号整数。

Int64 值类型表示值介于 -9,223,372,036,854,775,808 到+9,223,372,036,854,775,807 之间的整数。

参考文章

/zxsydyq/article/details/9125641

2.1.3.2 sizeof用法总结

一、sizeof用来计算一个变量,或者数据类型的长度,以字节为单位。

二、sizeof在数组与指针上的特性

1 对于直接的调用sizeof,如果是数组首地址,sizeof会输出数组所占地址空间的大小(字节为单位)。如果是一个指针的话,则输出在该系统中地址的字节宽度,即(位宽/8)。

如下代码:则会以输出4, 30(一个char占一个byte空间), 4。

int *a; char b[30]; char *c; printf("%d, %d, d\n", sizeof(a), sizeof(b),sizeof(c));

2 如果是通过函数传递过来的地址,那么sizeof会把数组首地址和指针无差别当成是地址。

如下的代码段输出 4, 4

void test_sizeof_addr(char *a) { printf("%d\n", sizeof(a)); } void test_sizeof_array(char a[]) { printf("%d\n", sizeof(a)); } int main() { char b[30]; test_sizeof_addr(b); test_sizeof_array(b); return 0; }

而且在编译时编译器会提示警告如下:

warning: ‘sizeof’ on array function parameter ‘a’ will return size of ‘char *’ [-Wsizeof-array-argument]。

详细解析文章

/u012520854/article/details/53511154

2.2 目录操作与文件系统

QDir类具有存取目录结构和内容的能力,使用它可以操作目录,存取目录或文件信息、操作底层文件系统,而且还可以存取Qt的资源文件。

Qt使用“/”作为通用的目录分割符合URL路径分隔符。如果在程序中使用“/”作为目录分隔符,Qt会将其自动转换为符合底层操作系统的分隔符(如Linux使用“/”,Windows

使用“\”)。

QDir可以使用相对路径或绝对路径指向一个文件。isRelative()和isAbsolute()函数可以判断QDir对象使用的是相对路径还是绝对路径。如果需要讲一个相对路径转换为绝

对路径,则使用makeAbsolute()函数。

目录的路径可以通过path()函数返回,通过setPath()函数设置新路径。绝对路径使用absolutePath()返回,目录名可以使用dirName()获得,它通常返回绝对路径中的最后

一个元素,如果QDir指向当前目录,则返回“.”。目录的路径可以通过cd()和cdUp()改变。可以使用mkdir()创建目录,rename()改变目录名。

判断目录是否存在可以使用exists(),目录的属性可以使用isReadable()、isAbsolute()、isRelative()和isRoot()来获取。目录下的很多条目,包括文件、目录和符号链接,

总的条目数可以使用count()来统计。entryList()返回目录下所有条目组成的字符串链表。文件可以使用remove()函数删除,删除目录用rmdir()。

“/” :Qt使用“/”作为通用的目录分割符合URL路径分隔符QDir :QDir可以使用相对路径或绝对路径指向一个文件path():目录的路径可以通过path()函数返回exists():判断目录是否存在可以使用exists()count() :总的条目数来统计(什么总条目?)entryList():返回目录下所有条目组成的字符串链表(小嗷不太懂返回什么链表?)remove():删除文件rmdir() :删除目录

除了count()和entryList()不太清楚,其余字面上都很好理解。

2.2.1 文件大小及路径获取实例

创建一个控制台项目

代码如下

#include <QCoreApplication>#include <QStringList>#include <QDir>#include <QtDebug>qint64 du(const QString &path){//设置查询目录QDir dir(path);qint64 size = 0;//返回当前目录所有的文件的信息foreach(QFileInfo fileInfo,dir.entryInfoList(QDir::Files)){//将文件大小都加起来size += fileInfo.size();}//对目录下的子目录进行遍历,并忽略"."和".."目录foreach(QString subDir,dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot)){//将子目录大小都加起来size += du(path+QDir::separator()+subDir);}//尺寸转换成M(大于1024时)或者Gchar unit ='B';qint64 curSize=size;if(curSize>1024){curSize/=1024;unit ='K';if(curSize>1024){curSize/=1024;unit ='M';if(curSize>1024){curSize/=1024;unit ='G';}}}//打印当前尺寸和路径qDebug()<<curSize<<unit<<"\t"<<qPrintable(path)<<endl;//输出尺寸return size;}int main(int argc, char *argv[]){QCoreApplication a(argc, argv);//创建一个字符串的ListQStringList args = a.arguments();QString path;//返回列表中出现的值的次数。if(args.count()>1){path = args[1];}else{path = QDir::currentPath();}qDebug()<<path<<endl;du(path);return a.exec();}

效果图

2.2.2 C++中的foreach用法

在c++中,一般人只知道foreach分开写为“for each”时的用法,却不知道“foreach”的用法。不多说,直接上代码。

QStringList listTemp;listTemp.append("aaa");listTemp.append("bbb");listTemp.append("ccc");QString strTemp1;QString strTemp2;foreach(strTemp1,listTemp){strTemp2= strTemp1;}

以上代码中,listTemp会把自己的每个项,依次赋值给strTemp1。本例中,strTemp共有三项,foreach会循环三次,strTemp1在这三次循环中,依次被赋值“aaa”,“bbb”,“ccc”。

总结:foreach用来遍历list,可以在遍历中基于 list 的相应项做相应操作。

2.3 文件系统浏览实例(自定义一个文件浏览窗口并获取当前目录路径)

文件系统的浏览是目录操作的一个常用功能。这里通过实现一个能够显示所有文件的文件系统的浏览功能,介绍如何使用QDir类显示文件系统目录及用过滤方式显示文件列表的方法。

QDir的entryInfoList()方法是按照某种过滤方式获得目录下的文件列表。

QFileInfoList QDir::entryInfoList(const QStringList &nameFilters,//此参数指定了文件名的过滤方式,如“*”,“.tar.gz”Filters filters = NoFilters,//此参数指定了文件属性的过滤方式,如目录、文件、读写属性等SortFlags sort = NoSort//此参数指定了列表的排序情况) const

QDir::Filter定义的过滤方式

QDir::SortFlag定义了一系列排序方式

创建一个FileView的项目,不带界面

代码如下

fileview.h

#ifndef FILEVIEW#define FILEVIEW#include <QDialog>#include <QLineEdit>#include <QDir>#include <QLineEdit>#include <QListWidget>#include <QListWidgetItem>#include <QFileInfoList>#include <QVBoxLayout>class FileView : public QDialog{Q_OBJECTpublic:FileView(QWidget *parent = 0, Qt::WindowFlags f = 0);~FileView();void showFileInfoList(QFileInfoList list);public slots:void slotShow(QDir dir);void slotDirShow(QListWidgetItem *item);private:QLineEdit *fileLineEdit;QListWidget *fileListWidget;QVBoxLayout *mainLayout;};

fileview.cpp

#include "fileview.h"#include <QStringList>#include <QIcon>FileView::FileView(QWidget *parent,Qt::WindowFlags f): QDialog(parent,f){setWindowTitle (tr("File View"));fileLineEdit = new QLineEdit(tr("/"));fileListWidget = new QListWidget;mainLayout = new QVBoxLayout(this);mainLayout->addWidget (fileLineEdit);mainLayout->addWidget (fileListWidget);connect (fileLineEdit, SIGNAL(returnPressed()), this, SLOT(slotShow(QDir)));connect (fileListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(slotDirShow(QListWidgetItem*)));QString root = "/";QDir rootDir(root);QStringList string;string << "*";QFileInfoList list = rootDir.entryInfoList (string);showFileInfoList(list);}FileView::~FileView (){}/** 显示dir下的所有文件*/void FileView::slotShow (QDir dir){QStringList string;string << "*";QFileInfoList list = dir.entryInfoList (string, QDir::AllEntries, QDir::DirsFirst);showFileInfoList (list);}/** 根据用户的选择显示下一级目录的所有文件*/void FileView::slotDirShow (QListWidgetItem *item){QString str = item->text ();//将下一级的目录保存在str中QDir dir;//定义一个QDir对象dir.setPath (fileLineEdit->text ()); //设置QDir对象的路径为当前目录路径dir.cd (str); //根据下一级目录名重新设置QDir对象的路径fileLineEdit->setText (dir.absolutePath ());//刷新显示当前的目录路径slotShow(dir);//显示当前目录下的所有文件}/** 用户可以双击浏览器中显示的目录进入下一级目录,或单击".."返回上一级目录,* 顶部的编辑框显示当前所在的目录路径,列表中显示当前该目录下的所有文件** for(unsigned int i = 0; i < list.count (); i++){...}:一次从QFilInfoList对象中取出所有项* 按目录和文件两种方式加入列表控件中。*/void FileView::showFileInfoList (QFileInfoList list){fileListWidget->clear (); //清空列表控件for(unsigned int i = 0; i < list.count (); i++){QFileInfo temFileInfo = list.at (i);if(temFileInfo.isDir ()){QIcon icon("dir.png");QString filename = temFileInfo.fileName ();QListWidgetItem *temp = new QListWidgetItem(icon, filename);fileListWidget->addItem (temp);}else if(temFileInfo.isFile ()){QIcon icon("file.png");QString filename = temFileInfo.fileName ();QListWidgetItem *temp = new QListWidgetItem(icon, filename);fileListWidget->addItem (temp);}}}

效果图

2.4 获取文件信息

QFileinfo类提供了对文本进行操作时获得的文件相关属性、包括文件名、文件大小、创建时间最后修改时间、最后访问时间及一些文件是否为目录、文件或符号链接和读写属性等。

代码如下:

fileinfo.h

#ifndef DIALOG_H#define DIALOG_H#include <QDialog>#include <QLabel>#include <QPushButton>#include <QLineEdit>#include <QCheckBox>class FileInfo : public QDialog{Q_OBJECTpublic:FileInfo(QWidget *parent = 0);~FileInfo();public slots:void slotFile();void slotGet();private:QLabel *fileNameLabel;QLineEdit *fileNameLineEdit;QPushButton *fileBtn;QLabel *sizeLabel;QLineEdit *sizeLineEdit;QLabel *createTimeLabel;QLineEdit *createTimeLineEdit;QLabel *lastModfiledLabel;QLineEdit *lastModFiledLineEdit;QLabel *lastReadLabel;QLineEdit *lastReadLineEdit;QLabel *propertyLabel;QCheckBox *isDirCheckBox;QCheckBox *isFileCheckBox;QCheckBox *isSymLinkCheckBox;QCheckBox *isHiddenCheckBox;QCheckBox *isReadableCheckBox;QCheckBox *isWriteableCheckBox;QCheckBox *isExecutableCheckBox;QPushButton *getBtn;};

fileinfo.cpp

#include "fileinfo.h"#include <QGridLayout>#include <QFileDialog>#include <QDateTime>FileInfo::FileInfo(QWidget *parent): QDialog(parent){fileNameLabel = new QLabel(tr("文件名:"));fileNameLineEdit = new QLineEdit;fileBtn = new QPushButton(tr("文件"));sizeLabel = new QLabel(tr("大小:"));sizeLineEdit = new QLineEdit;createTimeLabel = new QLabel(tr("创建时间:"));createTimeLineEdit = new QLineEdit;lastModfiledLabel = new QLabel(tr("最后修改时间:"));lastModFiledLineEdit = new QLineEdit;lastReadLabel = new QLabel(tr("最后访问时间"));lastReadLineEdit = new QLineEdit;propertyLabel = new QLabel(tr("属性:"));isDirCheckBox = new QCheckBox(tr("目录"));isFileCheckBox = new QCheckBox(tr("文件"));isSymLinkCheckBox = new QCheckBox(tr("符号链接"));isHiddenCheckBox = new QCheckBox(tr("隐藏"));isReadableCheckBox = new QCheckBox(tr("读"));isWriteableCheckBox = new QCheckBox(tr("写"));isExecutableCheckBox = new QCheckBox(tr("执行"));getBtn = new QPushButton(tr("获取文件信息"));QGridLayout *gridLayout = new QGridLayout;gridLayout->addWidget (fileNameLabel, 0, 0);gridLayout->addWidget (fileNameLineEdit, 0, 1);gridLayout->addWidget (fileBtn, 0, 2);gridLayout->addWidget (sizeLabel, 1, 0);gridLayout->addWidget (sizeLineEdit, 1, 1);gridLayout->addWidget (createTimeLabel, 2, 0);gridLayout->addWidget (createTimeLineEdit, 2, 1);gridLayout->addWidget (lastModfiledLabel, 3, 0);gridLayout->addWidget (lastModFiledLineEdit, 3, 1);gridLayout->addWidget (lastReadLabel, 4, 0);gridLayout->addWidget (lastReadLineEdit, 4, 1);QHBoxLayout *layout1 = new QHBoxLayout;layout1->addWidget (propertyLabel);QHBoxLayout *layout2 = new QHBoxLayout;layout2->addWidget (isDirCheckBox);layout2->addWidget (isFileCheckBox);layout2->addWidget (isSymLinkCheckBox);layout2->addWidget (isHiddenCheckBox);layout2->addWidget (isReadableCheckBox);layout2->addWidget (isWriteableCheckBox);layout2->addWidget (isExecutableCheckBox);QHBoxLayout *layout3 = new QHBoxLayout;layout3->addWidget (getBtn);QVBoxLayout *mainLayout = new QVBoxLayout(this);mainLayout->addLayout (gridLayout);mainLayout->addLayout (layout1);mainLayout->addLayout (layout2);mainLayout->addLayout (layout3);connect (fileBtn, SIGNAL(clicked(bool)), this, SLOT(slotFile()));connect (getBtn, SIGNAL(clicked(bool)), this, SLOT(slotGet()));}FileInfo::~FileInfo(){}void FileInfo::slotFile (){QString fileName = QFileDialog::getOpenFileName (this, "打开", ",", "files(*)");fileNameLineEdit->setText (fileName);}void FileInfo::slotGet (){QString file = fileNameLineEdit->text ();QFileInfo info(file);qint64 size = info.size ();QDateTime created = info.created ();QDateTime lastModfiled = info.lastModified ();QDateTime lastRead = info.lastRead ();bool isDir = info.isDir ();bool isFile = info.isFile ();bool isSymLink = info.isSymLink ();bool isHidden = info.isHidden ();bool isReadable = info.isReadable ();bool isWriteable = info.isWritable ();bool isExecutable = info.isExecutable ();sizeLineEdit->setText (QString::number (size));createTimeLineEdit->setText (created.toString());lastModFiledLineEdit->setText (lastModfiled.toString());lastReadLineEdit->setText (lastRead.toString());isDirCheckBox->setCheckState (isDir ? Qt::Checked : Qt::Unchecked);isFileCheckBox->setCheckState(isFile ? Qt::Checked : Qt::Unchecked);isSymLinkCheckBox->setCheckState(isSymLink ? Qt::Checked : Qt::Unchecked);isHiddenCheckBox->setCheckState(isHidden ? Qt::Checked : Qt::Unchecked);isReadableCheckBox->setCheckState(isReadable ? Qt::Checked : Qt::Unchecked);isWriteableCheckBox->setCheckState(isWriteable ? Qt::Checked: Qt::Unchecked);isExecutableCheckBox->setCheckState(isExecutable ? Qt::Checked : Qt::Unchecked);}

效果图如下:

本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)大家可以把我的数学水平想象成初中水平,毕竟小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年写文章主要是为了后人少走点弯路,多交点朋友,一起学习如果有好的图像识别群拉我进去QQ:631821577就我一个白板,最后还是成的,你们别怕,慢慢来把

分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。

邮箱:631821577@QQ群:736854977有什么疑问公众号提问,下班或者周六日回答,ths

小嗷为啥写这文章?考虑到在离线状态下,嵌入式设备也要正常运行,所以,需要保存数据到本地,等联网在自动上传到服务器。

扫扫盲 —什么是僵尸进程? 360软件就是典型的僵尸进程软件

推荐文章:

11.VS+OpenCV3.2+QT软件/插件(QT篇1) — OpenCV从零开始到图像(人脸 + 物体)识别系列

12.QT + OpenCV打包成应用(以及QT图标问题详细) — OpenCV从零开始到图像(人脸 + 物体)识别系列

19.Qt的视频播放(QT篇) — OpenCV从零开始到图像(人脸 + 物体)识别系列

22.从零开始开发QT软件思路(单片机的串口通信)– OpenCV从零开始到图像(人脸 + 物体)识别系列

26.菊花厂员工泄密事件(Qt5文件及磁盘处理)— OpenCV从零开始到图像(人脸 + 物体)识别系列

1. BS模型/CS模型以及C语言中.h和.c文件解析—(C到C++篇)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。