我是BigPangaea,一个毕业两年多的行业小白;
由于各项能力均不精通,就写一些工作当中的练习记录下来,以备后续所需;
根据项目需求,要实现监听文件夹内文件实时更新数据库的功能;
- 遍历文件夹内“.txt”类型的文件
//遍历文件夹内所有文件
void Savedatabase::tranverseFolder(QString path)
{
QDir dir(path); //判断路径是否存在
if(!dir.exists())
{
QMessageBox::warning(
this,
"Whether the path exists ",
"Path doesn't exist");
return;
}
dir.setFilter(QDir::Files | QDir::NoSymLinks);
QFileInfoList list = dir.entryInfoList();
int file_count = list.count();
if(file_count <= 0)
{
QMessageBox::warning(
this,
"Whether the folder is empty",
"Folder is empty");
return;
}
QStringList filelist;
for(int i = 0; i < file_count; i++)
{
QFileInfo file_info = list.at(i);
QString suffix = file_info.suffix();
if(QString::compare(suffix, QString("txt"), Qt::CaseInsensitive) == 0)
{
QString absolute_file_path = file_info.absoluteFilePath();
filelist.append(absolute_file_path);
}
}
QDateTime curDateTime = QDateTime::currentDateTime();
QStringList newlist = checkFile(currentfilelist, filelist);
if(newlist.isEmpty())
{
// qDebug() << "No new files";
return;
}
currentfilelist.clear();
for(int i = 0; i < filelist.count(); i ++)
{
currentfilelist.append(filelist[i]);
readFile(filelist[i]);
}
for(int i = 0; i < newlist.count(); i ++)
{
// qDebug() << curDateTime.toString("yyyy-MM-dd hh:mm:ss : ") + newlist[i];
readFile(newlist[i]);
}
}
- 读取文件内容
//读取文件内容
void Savedatabase::readFile(QString filename)
{
QFile file(filename);
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream in(&file);
// qDebug() << in.readLine();
textContent.clear();
while(!in.atEnd())
{
textContent.append(in.readLine());
}
qDebug() << textContent;
}
file.close();
saveDataToDatabase();
}
- 比较文件夹内的文件是否发生变化,发生变化后返回变化后的结果集
//比较文件夹内的文件是否发生变化,发生变化返回变化后的结果
QStringList Savedatabase::checkFile(QStringList& commonColumns, QStringList& currentcolumns)
{
QStringList newlist;
//判断两个QStringList是否为空
if(commonColumns.count() == 0 || currentcolumns.count() == 0)
{
if(commonColumns.count() == 0 && currentcolumns.count() != 0)
{
return currentcolumns;
}
else if(currentcolumns.count() == 0 && commonColumns.count() != 0)
{
return commonColumns;
}
else
{
return newlist;
}
}
commonColumns.sort();
currentcolumns.sort();
int count1 = commonColumns.count();
int count2 = currentcolumns.count();
int x = 0; int y = 0;
int flag = 0;
if(count1 < count2)
{
for(int i = x; i < count2; i ++)
{
for(int j = y; j < count1; j ++)
{
if(QString::compare(commonColumns[j], currentcolumns[i]) == 0)
{
flag = 1;
break;
}
}
if(! flag)
{
newlist.append(currentcolumns[i]);
}
flag = 0;
}
}
else
{
for(int i = x; i < count1; i ++)
{
for(int j = y; j < count2; j ++)
{
if(QString::compare(commonColumns[i], currentcolumns[j]) == 0)
{
flag = 1;
break;
}
}
if(! flag)
{
newlist.append(commonColumns[i]);
}
flag = 0;
}
}
return newlist;
}
- 在数据库中添加数据
void Savedatabase::saveDataToDatabase()
{
QxSqlDatabase::getSingleton()->setDriverName("QOCI");
QxSqlDatabase::getSingleton()->setDatabaseName("orcl");
QxSqlDatabase::getSingleton()->setHostName("localhost");
QxSqlDatabase::getSingleton()->setUserName("HR");
QxSqlDatabase::getSingleton()->setPassword("123456");
QxSqlDatabase::getSingleton()->setPort(1521);
Member member;
member.name = textContent.at(0);
member.phone = textContent.at(1);
member.gender = textContent.at(2);
member.age = textContent.at(3).toInt();
QSqlDatabase dataBase = QxSqlDatabase::getDatabase();
dataBase.transaction();
qx::dao::insert(member, &dataBase);
dataBase.commit();
}
注释:
功能介绍:根据设置好的文件夹,每3秒自动遍历文件夹下所有的txt文件;并且读取文件内容保存至oracle数据库中;
未实现功能:
1.目前只添加了读取txt文件,后续可添加读取其他类型的文本文件;
2.目前只有遍历文件后添加数据库数据,没有删除功能,后续可添加;
3.目前遍历文件夹下文件列表对比时,只保留修改的内容,意思是:如果文件夹内添加一个新文件时,会在数据库内添加数据,但是在删除一个文件时,也会在数据库内添加数据,不会进行删除,该功能需要后续完善QStringList对比函数;
4.读取文件内容后,添加到对应的数据库中;该功能未开发;
//已添加功能:添加数据到数据库