本文作者:小嗷
微信公众号:aoxiaoji
吹比QQ群:736854977
简书链接:https://www.jianshu.com/u/45da1fbce7d0
本信息都来源与网络公开内容。如有疑问,如有不实。请立即通知小嗷,立即删除,有关言论。
获取文件信息(小嗷感觉这才是关键,通过文件信息来判断,你几时打开文件【除去没用的进程exe,以一天为单位,读取你对ppt,execel,word等打开关闭文件的信息】)
当然,说到这里。大家和小嗷一样早就有对策,知己知彼,才能攻防胜利。(愿意分享自己的对策,可以和小嗷交流一下心得【没经本人同意小嗷,嘴巴严实】)
不仅是菊花厂绝大部分公司所有计算机都安装后台监控软件,监控操作行为。
那么在不联网的情况下,它们是怎么监控计算机你们是否窃密(提前没有任何外部接口)?
你们可能问没有外部接口怎么窃密?就说最简单拍照或者脑子记住。
N年前菊花厂某些员工就是这样被抓。
小嗷根据自己多年的社会经验出发,不联网的情况下,那么后台一定生成一份类似文件读写你们的对公司电脑的操作。(请记住小嗷的一句话:不同的系统,不同的语言,同样的套路)
首先介绍QFile类读写文本文件
(1)新建一个控制台项目(文件名称TextFile,一直下一步,Next)
代码如下:
#include
#include
#include
/*
* 打开一个文件有两种方式。一种方式是在构造函数中指文件名;另一种方式是使用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();
}
效果图
QTextStream提供了更为方便的接口来读写文本,它可以操作QIODevice、QByteArray和QString。使用QTextStream的流操作符,可以方便地读写单词、行和数字。
为了产生文本,QTextStream还提供了填充、对齐和数字格式化的选项。
#include
#include
#include
/*
* 将内容写入到文件中
*
* if(data.open(QFile::WriteOnly | QFile::Truncate))表示将原来文件中的内容清空。输出时将格式设为左对齐,占10个
* 字符位置。
*
* out << QObject::tr ("score:") << qSetFileWidth(10) << left << 90 <
效果图:
QDateStream类提供了将二进制文件串行化的功能,用于实现C++基本类数据类型,如char,short,int,char*等的串行化。更复杂的串行化操作则是通过将数据分解为基本类型完成的。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
//创建一个公共函数filefun
void filefun();
};
mainwindow.cpp
//在主函数中调用filefun
#include "mainwindow.h"
#include
#include
#include
#include
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,我就会采用这方法存取数据)
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
一、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]。
详细解析文章
https://blog.csdn.net/u012520854/article/details/53511154
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()。
除了count()和entryList()不太清楚,其余字面上都很好理解。
创建一个控制台项目
代码如下
#include
#include
#include
#include
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时)或者G
char 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()<1)
{
path = args[1];
}
else
{
path = QDir::currentPath();
}
qDebug()<
效果图
在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 的相应项做相应操作。
文件系统的浏览是目录操作的一个常用功能。这里通过实现一个能够显示所有文件的文件系统的浏览功能,介绍如何使用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
#include
#include
#include
#include
#include
#include
#include
class FileView : public QDialog
{
Q_OBJECT
public:
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
#include
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);
}
}
}
效果图
QFileinfo类提供了对文本进行操作时获得的文件相关属性、包括文件名、文件大小、创建时间最后修改时间、最后访问时间及一些文件是否为目录、文件或符号链接和读写属性等。
代码如下:
fileinfo.h
#ifndef DIALOG_H
#define DIALOG_H
#include
#include
#include
#include
#include
class FileInfo : public QDialog
{
Q_OBJECT
public:
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
#include
#include
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);
}
效果图如下:
分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。
小嗷为啥写这文章?考虑到在离线状态下,嵌入式设备也要正常运行,所以,需要保存数据到本地,等联网在自动上传到服务器。
扫扫盲 —什么是僵尸进程? 360软件就是典型的僵尸进程软件
推荐文章:
11.VS2015+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++篇)