今天在QT中写了两段代码,分别是从本地打开文件和将文件保存在本地,为了防止忘记一并将文件中的其他相关操作写下来:
(1)QIODevice
直接继承自QObject
QIODevice类是输入/输出设备的基类。
QIODevice为设备提供了公共实现和抽象接口用于读写块数据。
QIODevice是一个抽象类,不能被实例化。
被Q3Socket,Q3SocketDevice,QAbstractSocket,QBuffer,QFile,QLocalSocket,QNetworkReply,QProcess继承.
(2)QFile
继承自QIODevice
QFile类是一个操作文件的输入/输出设备。
QFile是用来读写二进制文件和文本文件的输入/输出设备。QFile可以自己单独被使用,但是如果和QDataStream或QTextStream一起使用将更加方便。
文件名通常可以通过构造函数来传递,但也可以使用setName()来设置。目录分隔符在任何操作系统下都使用“/",“/"不被支持。你可以通过exists()来检查一个文件是否存在并且可以通过remove()来移去一个文件。更多操作系统相关的高级文件系统操作QT提供了QFileInfo和QDir类.
文件可以用open()来打开、用close()来关闭、用flush()来刷新。数据通常可以使用QDataStream或者QTextStream进行读写,但你也可以使用read(),readLine(),readAll(),write()读写。QFile也支持getChar(),putChar(),和ungetChar()
size()可以返回文件的大小。你可以通过使用pos()函数得到当前文件位置或者使用seek()移到一个新的文件位置。如果你到了文件的末尾,atEnd()返回真。
(3)QDir
QDir类提供了访问目录结构和他们的内容。
QDir类提供了访问目录结构和它们的内容的与平台无关的方式。
QDir用来操作路径名称、关于路径和文件的访问信息和操作底层文件系统。
QDir使用相对或绝对文件路径来指向一个文件。绝对路径是从目录分隔符“/”或者带有一个驱动器标识(除了在Unix下)。如果你总是使用“/”作为目录分隔符,Qt将会把你的路径转化为符合底层的操作系统的。相对文件名是由一个目录名称或者文件名开始并且指定一个相对于当前路径的路径。
例如绝对路径:
QDir("/home/administrator/soft");
QDir("D:/software");
我们可以使用isRelative()或isAbsolute()函数确认QDir是用的相对路径还是绝对路径。使用makeAbsolute()来转换相对路径的QDir转换成绝对路径的QDir.
(4)QFileInfo
QFileInfo类提供了一个与平台无关的文件信息.
QFileInfo提供了关于系统中的文件名称和位置,访问权限和是否是符号链接,文件大小和上次修改/读写时间等,也能被用于Qt资源文件。
QFileInfo能通过相对/绝对路径指向一个文件。
可以使用isFile(),isDir(),isSymLink().symLinkTarget()函数提供符号链接的目标文件。
在Unix(包括Mac OS X)的符号链接具有与目标文件相同的大小(),因为Unix透明地处理符号链接;同样,打开一个符号连接使用的QFile有效地打开链接的目标.
在Windows中,符号链接(快捷方式)的lnk文件。它大小()的是,符号链接(而不是链接的目标)的大小,打开一个符号连接使用的QFile并打开。lnk文件。
读文件:
QFile file("E:\\Corner\\Desktop\\info.txt");
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug()<<"Can't open the file!"<<endl;
}
QList <QStringList> station_info;
QTextStream in(&file);
QString line;
while(!in.atEnd()){
line = in.readLine();//读取一行,还有读取所有readAll();
QStringList list = line.split(",");
station_info.push_back(list);
}
file.close();
QFile fileout("E:\\station_route.txt");
if(!fileout.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug() << "Open failed";
}
QTextStream txtOutput(&fileout);
for(int i = 0; i != station_route.size();i++){
txtOutput << station_route.at(i).join(",") << "\n";
}
从本地打开文件:
//获取文件名字
QString filename = QFileDialog::getOpenFileName(this,"Open File",QDir::currentPath()) ;
if(filename.isEmpty()) //名字为空
{
QMessageBox::information(this,"Error Meassage","Please select a file !");
return ;
}
QFile * file = new QFile() ; //创建文件
file->setFileName(filename);
bool ok = file->open(QIODevice::ReadOnly) ; //打开文件
if(ok)
{
QTextStream in(file) ; //文件与文本流相关关联
ui->textEdit->setText(in.readAll());//从文件中读取所有内容并显示
file->close();
delete file ;
}
else
{
QMessageBox::information(this,"Error Message","Open file fail !"+file->errorString()) ;
return ;
}
将文件保存在本地:
QString filename = QFileDialog::getSaveFileName(this,"Save File",QDir::currentPath()) ;
if(filename.isEmpty()) //名字为空
{
QMessageBox::information(this,"Error Meassage","Please select a file !");
return ;
}
QFile * file = new QFile() ; //创建文件
file->setFileName(filename);
bool ok = file->open(QIODevice::WriteOnly) ; //打开文件
if(ok)
{
QTextStream out(file) ; //文件与文本流相关关联
out<<ui->textEdit->toPlainText() ; //除去textedit中的纯文本
file->close();
delete file ;
}
else
{
QMessageBox::information(this,"Error Message","Save file fail !"+file->errorString()) ;
return ;
}