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


本文作者:小嗷

微信公众号:aoxiaoji

吹比QQ群:736854977

简书链接:https://www.jianshu.com/u/45da1fbce7d0


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

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

  1. QT读写文件(后台搞个僵尸进程获取你在离线下操作,写入某文本)
  2. int16 int32 int64区别
  3. sizeof用法总结
  4. C++中的foreach用法
  5. 文件大小及路径获取实例(监控你的某目录的变化,获取某文本绝对路径)
  6. 文件系统浏览实例(自定义一个文件浏览窗口并获取当前目录路径)【实时获取当前目录路径。如果菊花厂网络部门这么做,一/文件三个月清理一次,数据文件大不大我不知道。但是,以社会经验来看网络部门居心不轨】
  7. 获取文件信息(小嗷感觉这才是关键,通过文件信息来判断,你几时打开文件【除去没用的进程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 
#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();
}

效果图

2.1.2 QTextStream类读写文本

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 <

效果图:

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 
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,我就会采用这方法存取数据)

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。

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

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()。

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

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

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

创建一个控制台项目

代码如下

#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()<

效果图

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 
#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);
        }
    }
}

效果图

2.4 获取文件信息

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);
}

效果图如下:

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

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

  • 邮箱:[email protected]
  • QQ群:736854977
  • 有什么疑问公众号提问,下班或者周六日回答,ths

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

扫扫盲 —什么是僵尸进程? 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++篇)

你可能感兴趣的:(OpenCv,-)