本文作者:小嗷
微信公众号:aoxiaoji
吹比QQ群:736854977
微信链接:https://mp.weixin.qq.com/s?__biz=MzU1MTgxNjQyMg==&tempkey=OTYyX1padDhDcHRGNTQ2TDI0NjhPLW15RzRmVWlOS3hfZUpNLWpKTFdRMG1KQWZZeGFDdHcyeFV2dEpHcU1ZSW5IRUh6eXMxR2I4NFBCZEFNa3FJY0pTaEhBeVhVNm9FSXl3NHZ2MkJVa1FHbWVOeUd1X25lMWtuNTItcXZZeFBLcjNybUhHOG9Pd0xyUDJpaWlCT05XSkZkYVpfcEFRLWw1bHUyYUh1eGd%2Bfg%3D%3D&chksm=7b8adc5f4cfd5549427aabe9e93fa5bbec2d18336a2aa6a7f87ded256be241cb7778db9a47f8#rd
本信息都来源与网络公开内容。如有疑问,如有不实。请立即通知小嗷,立即删除,有关言论。
本文你会找到以下问题的答案:
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)
代码如下:
1#include 2#include 3#include 4/* 5 * 打开一个文件有两种方式。一种方式是在构造函数中指文件名;另一种方式是使用setFileName()函数设置文件名。 6 * 7 * 打开文件使用open()函数,关闭文件使用close()函数。此处的open()函数以只读方式打开文件,只读方式参数为 8 * QIODevice::ReadOnly,只写方式参数为QIODevice::WriteOnly,读写参数为QIODevice::ReadWrite。 9 *10 * qint64 lineLen = file.readLine(buffer, sizeof(buffer)):在QFile中可以使用从QIODevice中继11 * 承的readLine()函数读取文件中的一行。12 *13 * if(LineLen != -1){qDebug() << buffer}:如果读取成功,则readLine()函数返回实际读取的字节数;如果14 * 读取失败,则返回“-1”15 *16*/17int main(int argc, char *argv[])18{19 QCoreApplication a(argc, argv);20 QFile file("textFile1.txt");21 if(file.open (QIODevice::ReadOnly))22 {23 char buffer[1024];24 qint64 LineLen = file.readLine (buffer, sizeof(buffer));25 if(LineLen != -1)26 {27 qDebug() << buffer;28 }29 }30 file.close ();31 return a.exec();32}
效果图
2.1.2 QTextStream类读写文本
QTextStream提供了更为方便的接口来读写文本,它可以操作QIODevice、QByteArray和QString。使用QTextStream的流操作符,可以方便地读写单词、行和数字。 为了产生文本,QTextStream还提供了填充、对齐和数字格式化的选项。
1#include 2#include 3#include 4/* 5 * 将内容写入到文件中 6 * 7 * if(data.open(QFile::WriteOnly | QFile::Truncate))表示将原来文件中的内容清空。输出时将格式设为左对齐,占10个 8 * 字符位置。 9 *10 * out << QObject::tr ("score:") << qSetFileWidth(10) << left << 90 <
效果图:
2.1.2.1 QTextStream的格式化函数
[图片上传失败...(image-2df63-1530071687174)]
2.1.2.2 QTextStream的流操作符
2.1.3 读写二进制文件
QDateStream类提供了将二进制文件串行化的功能,用于实现C++基本类数据类型,如char,short,int,char*等的串行化。更复杂的串行化操作则是通过将数据分解为基本类型完成的。
mainwindow.h
1#ifndef MAINWINDOW_H 2#define MAINWINDOW_H 3#include 4class MainWindow : public QMainWindow 5{ 6 Q_OBJECT 7public: 8 MainWindow(QWidget *parent = 0); 9 ~MainWindow();10 //创建一个公共函数filefun11 void filefun();12};
mainwindow.cpp
1//在主函数中调用filefun 2#include "mainwindow.h" 3#include 4#include 5#include 6#include 7MainWindow::MainWindow(QWidget *parent) 8 : QMainWindow(parent) 9{10 filefun ();11}12MainWindow::~MainWindow()13{14}15void MainWindow::filefun ()16{17 /*将二进制数据写到数据流*/18 QFile file("binary.dat");19 file.open (QFile::WriteOnly | QFile::Truncate);20 QDataStream out(&file); //将数据序列化21 out << QString(tr("张卫东:")); //将字符串序列化22 out << QDate::fromString ("1990/04/01", "yyyy/MM/dd"); //讲整数序列化23 out << (qint32)25;24 file.close ();25 /*从文件中读取数据*/26 file.setFileName ("binary.dat");27 if(!file.open (QFile::ReadOnly))28 {29 qDebug() << "error" << endl;30 return;31 }32 QDataStream in(&file);33 QString name;34 QDate birthday;35 qint32 age;36 in >> name >> birthday >> age; //将获取字符串和整数37 qDebug() << name << birthday << age;38 file.close ();39}
运行效果:
为啥出现文件出现乱码?因为输入的数是二进制数据,只有用二进制编码打开,才不会出现乱码。(要是我是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 之间的整数。
参考文章
https://blog.csdn.net/zxsydyq/article/details/9125641
2.1.3.2 sizeof用法总结
一、sizeof用来计算一个变量,或者数据类型的长度,以字节为单位。
二、sizeof在数组与指针上的特性
1 对于直接的调用sizeof,如果是数组首地址,sizeof会输出数组所占地址空间的大小(字节为单位)。如果是一个指针的话,则输出在该系统中地址的字节宽度,即(位宽/8)。
如下代码:则会以输出4, 30(一个char占一个byte空间), 4。
1int *a; 2char b[30]; 3char *c; 4printf("%d, %d, d\n", sizeof(a), sizeof(b),sizeof(c));
2 如果是通过函数传递过来的地址,那么sizeof会把数组首地址和指针无差别当成是地址。
如下的代码段输出 4, 4
1void test_sizeof_addr(char *a) 2{ 3 printf("%d\n", sizeof(a)); 4} 5void test_sizeof_array(char a[]) 6{ 7 printf("%d\n", sizeof(a)); 8} 9int main() 10{ 11 char b[30]; 12 test_sizeof_addr(b); 13 test_sizeof_array(b); 14 return 0; 15}
而且在编译时编译器会提示警告如下: warning: ‘sizeof’ on array function parameter ‘a’ will return size of ‘char *’ [-Wsizeof-array-argument]。
详细解析文章
https://blog.csdn.net/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 文件大小及路径获取实例
创建一个控制台项目
代码如下
1#include 2#include 3#include 4#include 5qint64 du(const QString &path) 6{ 7 //设置查询目录 8 QDir dir(path); 9 qint64 size = 0;10 //返回当前目录所有的文件的信息11 foreach(QFileInfo fileInfo,dir.entryInfoList(QDir::Files))12 {13 //将文件大小都加起来14 size += fileInfo.size();15 }16 //对目录下的子目录进行遍历,并忽略"."和".."目录17 foreach(QString subDir,dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))18 {19 //将子目录大小都加起来20 size += du(path+QDir::separator()+subDir);21 }22 //尺寸转换成M(大于1024时)或者G23 char unit ='B';24 qint64 curSize=size;25 if(curSize>1024)26 {27 curSize/=1024;28 unit ='K';29 if(curSize>1024)30 {31 curSize/=1024;32 unit ='M';33 if(curSize>1024)34 {35 curSize/=1024;36 unit ='G';37 }38 }39 }40 //打印当前尺寸和路径41 qDebug()<1)53 {54 path = args[1];55 }56 else57 {58 path = QDir::currentPath();59 }60 qDebug()<
效果图
2.2.2 C++中的foreach用法
在c++中,一般人只知道foreach分开写为“for each”时的用法,却不知道“foreach”的用法。不多说,直接上代码。
1QStringList listTemp; 2listTemp.append("aaa"); 3listTemp.append("bbb"); 4listTemp.append("ccc"); 5QString strTemp1; 6QString strTemp2; 7foreach(strTemp1,listTemp) 8{ 9 strTemp2= strTemp1;10}
以上代码中,listTemp会把自己的每个项,依次赋值给strTemp1。本例中,strTemp共有三项,foreach会循环三次,strTemp1在这三次循环中,依次被赋值“aaa”,“bbb”,“ccc”。 总结:foreach用来遍历list,可以在遍历中基于 list 的相应项做相应操作。
2.3 文件系统浏览实例(自定义一个文件浏览窗口并获取当前目录路径)
文件系统的浏览是目录操作的一个常用功能。这里通过实现一个能够显示所有文件的文件系统的浏览功能,介绍如何使用QDir类显示文件系统目录及用过滤方式显示文件列表的方法。
QDir的entryInfoList()方法是按照某种过滤方式获得目录下的文件列表。
1QFileInfoList QDir::entryInfoList2(3 const QStringList &nameFilters, //此参数指定了文件名的过滤方式,如“*”,“.tar.gz”4 Filters filters = NoFilters, //此参数指定了文件属性的过滤方式,如目录、文件、读写属性等5 SortFlags sort = NoSort //此参数指定了列表的排序情况6) const
QDir::Filter定义的过滤方式
QDir::SortFlag定义了一系列排序方式
创建一个FileView的项目,不带界面
代码如下
fileview.h
1#ifndef FILEVIEW 2#define FILEVIEW 3#include 4#include 5#include 6#include 7#include 8#include 9#include 10#include 11class FileView : public QDialog12{13 Q_OBJECT14public:15 FileView(QWidget *parent = 0, Qt::WindowFlags f = 0);16 ~FileView();17 void showFileInfoList(QFileInfoList list);18public slots:19 void slotShow(QDir dir);20 void slotDirShow(QListWidgetItem *item);21private:22 QLineEdit *fileLineEdit;23 QListWidget *fileListWidget;24 QVBoxLayout *mainLayout;25};
fileview.cpp
1#include "fileview.h" 2#include 3#include 4FileView::FileView(QWidget *parent,Qt::WindowFlags f) 5 : QDialog(parent,f) 6{ 7 setWindowTitle (tr("File View")); 8 fileLineEdit = new QLineEdit(tr("/")); 9 fileListWidget = new QListWidget;10 mainLayout = new QVBoxLayout(this);11 mainLayout->addWidget (fileLineEdit);12 mainLayout->addWidget (fileListWidget);13 connect (fileLineEdit, SIGNAL(returnPressed()), this, SLOT(slotShow(QDir)));14 connect (fileListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(slotDirShow(QListWidgetItem*)));15 QString root = "/";16 QDir rootDir(root);17 QStringList string;18 string << "*";19 QFileInfoList list = rootDir.entryInfoList (string);20 showFileInfoList(list);21}22FileView::~FileView ()23{24}25/*26 * 显示dir下的所有文件27*/28void FileView::slotShow (QDir dir)29{30 QStringList string;31 string << "*";32 QFileInfoList list = dir.entryInfoList (string, QDir::AllEntries, QDir::DirsFirst);33 showFileInfoList (list);34}35/*36 * 根据用户的选择显示下一级目录的所有文件37*/38void FileView::slotDirShow (QListWidgetItem *item)39{40 QString str = item->text (); //将下一级的目录保存在str中41 QDir dir; //定义一个QDir对象42 dir.setPath (fileLineEdit->text ()); //设置QDir对象的路径为当前目录路径43 dir.cd (str); //根据下一级目录名重新设置QDir对象的路径44 fileLineEdit->setText (dir.absolutePath ());//刷新显示当前的目录路径45 slotShow(dir); //显示当前目录下的所有文件46}47/*48 * 用户可以双击浏览器中显示的目录进入下一级目录,或单击".."返回上一级目录,49 * 顶部的编辑框显示当前所在的目录路径,列表中显示当前该目录下的所有文件50 *51 * for(unsigned int i = 0; i < list.count (); i++){...}:一次从QFilInfoList对象中取出所有项52 * 按目录和文件两种方式加入列表控件中。53*/54void FileView::showFileInfoList (QFileInfoList list)55{56 fileListWidget->clear (); //清空列表控件57 for(unsigned int i = 0; i < list.count (); i++)58 {59 QFileInfo temFileInfo = list.at (i);60 if(temFileInfo.isDir ())61 {62 QIcon icon("dir.png");63 QString filename = temFileInfo.fileName ();64 QListWidgetItem *temp = new QListWidgetItem(icon, filename);65 fileListWidget->addItem (temp);66 }67 else if(temFileInfo.isFile ())68 {69 QIcon icon("file.png");70 QString filename = temFileInfo.fileName ();71 QListWidgetItem *temp = new QListWidgetItem(icon, filename);72 fileListWidget->addItem (temp);73 }74 }75}
效果图
2.4 获取文件信息
QFileinfo类提供了对文本进行操作时获得的文件相关属性、包括文件名、文件大小、创建时间最后修改时间、最后访问时间及一些文件是否为目录、文件或符号链接和读写属性等。
代码如下:
fileinfo.h
1#ifndef DIALOG_H 2#define DIALOG_H 3#include 4#include 5#include 6#include 7#include 8class FileInfo : public QDialog 9{10 Q_OBJECT11public:12 FileInfo(QWidget *parent = 0);13 ~FileInfo();14public slots:15 void slotFile();16 void slotGet();17private:18 QLabel *fileNameLabel;19 QLineEdit *fileNameLineEdit;20 QPushButton *fileBtn;21 QLabel *sizeLabel;22 QLineEdit *sizeLineEdit;23 QLabel *createTimeLabel;24 QLineEdit *createTimeLineEdit;25 QLabel *lastModfiledLabel;26 QLineEdit *lastModFiledLineEdit;27 QLabel *lastReadLabel;28 QLineEdit *lastReadLineEdit;29 QLabel *propertyLabel;30 QCheckBox *isDirCheckBox;31 QCheckBox *isFileCheckBox;32 QCheckBox *isSymLinkCheckBox;33 QCheckBox *isHiddenCheckBox;34 QCheckBox *isReadableCheckBox;35 QCheckBox *isWriteableCheckBox;36 QCheckBox *isExecutableCheckBox;37 QPushButton *getBtn;38};
fileinfo.cpp
1#include "fileinfo.h" 2#include 3#include 4#include 5FileInfo::FileInfo(QWidget *parent) 6 : QDialog(parent) 7{ 8 fileNameLabel = new QLabel(tr("文件名:")); 9 fileNameLineEdit = new QLineEdit;10 fileBtn = new QPushButton(tr("文件"));11 sizeLabel = new QLabel(tr("大小:"));12 sizeLineEdit = new QLineEdit;13 createTimeLabel = new QLabel(tr("创建时间:"));14 createTimeLineEdit = new QLineEdit;15 lastModfiledLabel = new QLabel(tr("最后修改时间:"));16 lastModFiledLineEdit = new QLineEdit;17 lastReadLabel = new QLabel(tr("最后访问时间"));18 lastReadLineEdit = new QLineEdit;19 propertyLabel = new QLabel(tr("属性:"));20 isDirCheckBox = new QCheckBox(tr("目录"));21 isFileCheckBox = new QCheckBox(tr("文件"));22 isSymLinkCheckBox = new QCheckBox(tr("符号链接"));23 isHiddenCheckBox = new QCheckBox(tr("隐藏"));24 isReadableCheckBox = new QCheckBox(tr("读"));25 isWriteableCheckBox = new QCheckBox(tr("写"));26 isExecutableCheckBox = new QCheckBox(tr("执行"));27 getBtn = new QPushButton(tr("获取文件信息"));28 QGridLayout *gridLayout = new QGridLayout;29 gridLayout->addWidget (fileNameLabel, 0, 0);30 gridLayout->addWidget (fileNameLineEdit, 0, 1);31 gridLayout->addWidget (fileBtn, 0, 2);32 gridLayout->addWidget (sizeLabel, 1, 0);33 gridLayout->addWidget (sizeLineEdit, 1, 1);34 gridLayout->addWidget (createTimeLabel, 2, 0);35 gridLayout->addWidget (createTimeLineEdit, 2, 1);36 gridLayout->addWidget (lastModfiledLabel, 3, 0);37 gridLayout->addWidget (lastModFiledLineEdit, 3, 1);38 gridLayout->addWidget (lastReadLabel, 4, 0);39 gridLayout->addWidget (lastReadLineEdit, 4, 1);40 QHBoxLayout *layout1 = new QHBoxLayout;41 layout1->addWidget (propertyLabel);42 QHBoxLayout *layout2 = new QHBoxLayout;43 layout2->addWidget (isDirCheckBox);44 layout2->addWidget (isFileCheckBox);45 layout2->addWidget (isSymLinkCheckBox);46 layout2->addWidget (isHiddenCheckBox);47 layout2->addWidget (isReadableCheckBox);48 layout2->addWidget (isWriteableCheckBox);49 layout2->addWidget (isExecutableCheckBox);50 QHBoxLayout *layout3 = new QHBoxLayout;51 layout3->addWidget (getBtn);52 QVBoxLayout *mainLayout = new QVBoxLayout(this);53 mainLayout->addLayout (gridLayout);54 mainLayout->addLayout (layout1);55 mainLayout->addLayout (layout2);56 mainLayout->addLayout (layout3);57 connect (fileBtn, SIGNAL(clicked(bool)), this, SLOT(slotFile()));58 connect (getBtn, SIGNAL(clicked(bool)), this, SLOT(slotGet()));59}60FileInfo::~FileInfo()61{62}63void FileInfo::slotFile ()64{65 QString fileName = QFileDialog::getOpenFileName (this, "打开", ",", "files(*)");66 fileNameLineEdit->setText (fileName);67}68void FileInfo::slotGet ()69{70 QString file = fileNameLineEdit->text ();71 QFileInfo info(file);72 qint64 size = info.size ();73 QDateTime created = info.created ();74 QDateTime lastModfiled = info.lastModified ();75 QDateTime lastRead = info.lastRead ();76 bool isDir = info.isDir ();77 bool isFile = info.isFile ();78 bool isSymLink = info.isSymLink ();79 bool isHidden = info.isHidden ();80 bool isReadable = info.isReadable ();81 bool isWriteable = info.isWritable ();82 bool isExecutable = info.isExecutable ();83 sizeLineEdit->setText (QString::number (size));84 createTimeLineEdit->setText (created.toString());85 lastModFiledLineEdit->setText (lastModfiled.toString());86 lastReadLineEdit->setText (lastRead.toString());87 isDirCheckBox->setCheckState (isDir ? Qt::Checked : Qt::Unchecked);88 isFileCheckBox->setCheckState(isFile ? Qt::Checked : Qt::Unchecked);89 isSymLinkCheckBox->setCheckState(isSymLink ? Qt::Checked : Qt::Unchecked);90 isHiddenCheckBox->setCheckState(isHidden ? Qt::Checked : Qt::Unchecked);91 isReadableCheckBox->setCheckState(isReadable ? Qt::Checked : Qt::Unchecked);92 isWriteableCheckBox->setCheckState(isWriteable ? Qt::Checked: Qt::Unchecked);93 isExecutableCheckBox->setCheckState(isExecutable ? Qt::Checked : Qt::Unchecked);94}
效果图如下:
本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)
大家可以把我的数学水平想象成初中水平,毕竟小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年
写文章主要是为了后人少走点弯路,多交点朋友,一起学习
如果有好的图像识别群拉我进去QQ:631821577
就我一个白板,最后还是成的,你们别怕,慢慢来把
分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。
QQ群:736854977
有什么疑问公众号提问,下班或者周六日回答,ths
小嗷为啥写这文章?考虑到在离线状态下,嵌入式设备也要正常运行,所以,需要保存数据到本地,等联网在自动上传到服务器。
扫扫盲 ---什么是僵尸进程? 360软件就是典型的僵尸进程软件
QT相关文章:
11.VS2015+OpenCV3.2+QT软件/插件(QT篇1) --- OpenCV从零开始到图像(人脸 + 物体)识别系列
12.QT + OpenCV打包成应用(以及QT图标问题详细) --- OpenCV从零开始到图像(人脸 + 物体)识别系列
19.Qt的视频播放(QT篇) --- OpenCV从零开始到图像(人脸 + 物体)识别系列
22.从零开始开发QT软件思路(单片机的串口通信)-- OpenCV从零开始到图像(人脸 + 物体)识别系列
相关代码:
链接:
https://pan.baidu.com/s/1EI2PbmrQf-8CxEKQXEtAUg
密码:q2n5