QFile类是一个操作文件的输入/输出设备。
#include
详细描述
QFile类是一个操作文件的输入/输出设备。
QFile是用来读写二进制文件和文本文件的输入/输出设备。QFile可以自己单独被使用,但是如果和QDataStream或QTextStream一起使用将更加方便。
文件名通常可以通过构造函数来传递,但也可以使用setName()来设置。你可以通过exists()来检查一个文件是否存在并且可以通过remove()来移去一个文件。
文件可以用open()来打开、用close()来关闭、用flush()来刷新。数据通常可以使用QDataStream 或者QTextStream进行读写,但你也可以使用readBlock()和readLine()来读,使用writeBlock()来写。QFile也支持getch()、ungetch()和putch()。
size()可以返回文件的大小。你可以通过使用at()函数得到当前文件位置或者移到一个新的文件位置。如果你到了文件的末尾,atEnd()返回真。handle()返回文件句柄。
这里是一个使用QTextStream来一行一行地读取一个文本文件的代码段。它会把每一行带上一个行号打印出来。
QStringList lines; QFile file( "file.txt" ); if ( file.open( IO_ReadOnly ) ) { QTextStream stream( &file ); QString line; int n = 1; while ( !stream.eof() ) { line = stream.readLine(); // 不包括“\n”的一行文本printf( "=: %s\n", n++, https://www.wendangku.net/doc/2b14110421.html,tin1() ); lines += line; } file.close(); }
写文本也很容易(假设我们有一个行的字符串列表要写):
QFile file( "file.txt" ); if ( file.open( IO_WriteOnly ) ) { QTextStream stream( &file ); for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it ) stream << *it << "\n"; file.close(); }
QFileInfo类控制文件的详细信息,比如访问权限、文件日期和文件类型。
QDir类管理目录和文件名列表。
Qt使用Unicode文件名。如果你想在Unix系统上使用你自己的输入/输出,你可以使用encodeName()(和decodeName())来把文件名转换为本地编码。
也可以参考QDataStream、QTextStream和输入/输出和网络。
成员类型文档
QFile::DecoderFn
被QFile::setDecodingFunction()使用。
QFile::EncoderFn
被QFile::setEncodingFunction()使用。
成员函数文档
QFile::QFile ()
构造一个没有名称的QFile。
QFile::QFile ( const QString & name )
构造一个文件名为name的QFile。
也可以参考setName()。
QFile::~QFile ()
析构QFile。调用close()。
bool QFile::at ( Offset pos ) [虚]
设置文件索引到pos。如果成功,返回真,否则返回假。
实例:
QFile f( "data.bin" ); f.open( IO_ReadOnly ); // 索引设置为0 f.at( 100 ); // 设置索引为100 f.at( f.at()+50 ); // 设置索引为150 f.at( f.size()-80 ); // 设置索引为EOF之前的80 f.close();
不带参数使用at()可以重新得到文件的位移。
警告:如果文件是使用IO_Append方式打开(open())的话,结果是未定义的。
也可以参考size()和open()。
从QIODevice中重新实现的。
Offset QFile::at () const [虚]
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
返回文件中的位置。
也可以参考size()。
从QIODevice中重新实现的。
bool QFile::atEnd () const [虚]
如果到达文件的末尾,返回真,否则返回假。
也可以参考size()。
从QIODevice中重新实现的。
void QFile::close () [虚]
关闭一个打开的文件。
如果一个文件是使用一个存在的文件句柄打开的,那么它不是关闭的。如果这个存在的文件句柄是一个FILE*,这个文件被刷新。如果这个存在的文件句柄是一个int文件描述符,那么对这个文件将没有操作。
一些“在后面写的”文件系统也许会在关闭文件时报告一个未详细说明的错误。这些错误只表明在上一次打开(open())之后也许发生了一些错误。在这种情况下,status()会在关闭之后(close())报告IO_UnspecifiedError,否则是IO_Ok。
也可以参考open()和flush()。
实例:application/application.cpp、chart/chartform_files.cpp、helpviewer/helpwindow.cpp、mdi/application.cpp、qdir/qdir.cpp、qwerty/qwerty.cpp和xml/outliner/outlinetree.cpp。
从QIODevice中重新实现的。
QString QFile::decodeName ( const QCString & localFileName ) [静态]
这个将会使用localFileName做与QFile::encodeName()相反的操作。
也可以参考setDecodingFunction()。
QCString QFile::encodeName ( const QString & fileName ) [静态]
当你使用QFile时,在Qt中QFileInfo和QDir访问文件系统,你可以使用Unicode文件名。在Unix上,这些文件名被转换为8位的编码。如果你想在Unix上使用你自己的文件输入/输出,你应该使用这个函数来转换文件名。在Windows NT上,Unicode文件名在文件系统中是直接被支持的并且这个函数应该避免使用。在Windows 95上,在这时候非Latin1的场所设置是不被支持的。
默认情况下,这个函数把fileName转换为本地的8位编码,这取决于用户的场所设置。对于用户选择的文件名这足够了。应用程序中的文件名硬编码只是需要使用7位ASCII文件名字符。
这种转换方案可以使用setEncodingFunction()来改变。如果你需要给用户一个存储文件名为utf-8等等情况下,这也许很有用,但是这些文件名可能在这之后对其它应用程序来说是不
可识别的。
也可以参考decodeName()。
bool QFile::exists ( const QString & fileName ) [静态]
如果给定的文件fileName存在,返回真,否则返回假。
实例:chart/chartform.cpp、dirview/dirview.cpp和helpviewer/helpwindow.cpp。
bool QFile::exists () const
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
如果这个文件存在,返回真,否则返回假。
也可以参考name()。
void QFile::flush () [虚]
刷新文件缓存到磁盘。
close()也刷新文件缓存。
从QIODevice中重新实现的。
int QFile::getch () [虚]
从文件中读取一个单字节/字符。
返回所读的字节/字符,如果到达文件的末尾,返回-1。
也可以参考putch()和ungetch()。
从QIODevice中重新实现的。
int QFile::handle () const
返回这个文件的文件句柄。
如果是一个小的正整数,可以用在像fdopen()和fcntl()这样的C库函数中,也可以用在QSocketNotifier中。
如果这个文件没有被打开或者存在错误,handle()返回-1。
也可以参考QSocketNotifier。
QString QFile::name () const
返回由setName()设置的名称。
也可以参考setName()和QFileInfo::fileName()。
bool QFile::open ( int m ) [虚]
使用m模式和当前指定的文件名打开文件。如果成功,返回真,否则返回假。
模式参数m必须是下列标记的组合:
IO_Raw 指定直接的(非缓存的)文件访问。
IO_ReadOnly 以只读模式打开文件。
IO_WriteOnly 以只写模式(并且截短)打开文件。
IO_ReadWrite 以读/写模式打开文件,等于(IO_ReadOnly | IO_WriteOnly)。
IO_Append 以附加的模式打开文件。当你想向日志文件写些东西时这个模式非常有用。文件索引被设置到文件末尾。注意如果你在附加模式中使用at()定位文件索引,结果将是为定义的。
IO_Truncate 截短文件。
IO_Translate 在MS-DOS、Windows和OS/2下对文本文件翻译回车和换行。
直接访问模式在输入/输出的块操作使用4千字节或更大的情况下使用最好。当每次读小量数据时,缓存访问工作的更好。
重要:当使用缓存的文件工作时,数据没有被立刻写到文件中。调用flush()可以确保数据被真正地写完。
警告:如果你有一个缓存文件以同时读写方式打开,你不要在一次输入操作之后立即输出,
反之亦然。你必须在输入和输出操作之间调用flush()或者一次文件定位操作,比如seek(),否则缓存中可能会包含无用信息。
如果文件不存在并且指定IO_WriteOnly或IO_ReadWrite时,文件被创建。
实例:
QFile f1( "/tmp/data.bin" ); QFile f2( "readme.txt" ); f1.open( IO_Raw | IO_ReadWrite | IO_Append ); f2.open( IO_ReadOnly | IO_Translate );
也可以参考name()、close()、isOpen()和flush()。
实例:action/application.cpp、application/application.cpp、chart/chartform_files.cpp、helpviewer/helpwindow.cpp、qdir/qdir.cpp、qwerty/qwerty.cpp和xml/outliner/outlinetree.cpp。从QIODevice中重新实现的。
bool QFile::open ( int m, FILE * f )
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
使用m模式和一个存在的文件句柄f打开文件。如果成功,返回真,否则返回假。
实例:
#include
f.writeBlock( msg, qstrlen(msg) ); // 写到标准错误输出(stderr)f.close(); }
当使用这个函数打开一个QFile时,close()并不真正关闭这个文件,只是刷新它。
警告:如果f是标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr),你也许不能搜索。更详细的信息请看QIODevice::isSequentialAccess()。
也可以参考close()。
bool QFile::open ( int m, int f )
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
使用m模式和一个存在的文件描述符f打开文件。如果成功,返回真,否则返回假。
当使用这个函数打开一个QFile时,close()并不真正关闭这个文件。
使用这个函数打开一个QFile时,它被自动设置为直接模式,这就意味着文件输入/输出函数是慢的。如果你需要更好的执行效率,请你试着使用其它打开函数。
警告:如果f是0(stdin)、1(stdout)或2(stderr)其中之一时,你也许不能搜索。size()被设置为INT_MAX(在limits.h文件中)。
也可以参考close()。
int QFile::putch ( int ch ) [虚]
写字符ch到文件。
返回ch,或者如果发生错误,返回-1。
也可以参考getch()和ungetch()。
从QIODevice中重新实现的。
QByteArray QIODevice::readAll () [虚]
这个方便的函数返回这个设备中的所有剩余数据。
Q_LONG QFile::readBlock ( char * p, Q_ULONG len ) [虚]
从这个文件中读取最多maxlen字节到p并且返回实际读取的字节数量。
如果发生严重错误,返回-1。
警告:当一个缓存文件为了读写而打开时,我们已经在使用一些C库时遇到了问题。如果在一个写操作后立即执行一个读操作,读缓存中就会包含无用信息。更可怕的是,一些无用信息被写到文件中。在readBlock()之前调用flush()就可以解决这个问题。
也可以参考writeBlock()。
实例:qwerty/qwerty.cpp。
从QIODevice中重新实现的。
Q_LONG QFile::readLine ( char * p, Q_ULONG maxlen ) [虚]
读一行文本。
从这个文本中读取最多maxlen字节或者行结束符到p,哪个先发生以哪个为准。返回实际读取的字节数量,或者如果发生错误,返回-1。换行将不会被省略。
这个函数只对缓存文件有效。避免在以IO_Raw标记方式打开的文件中使用readLine()。
也可以参考readBlock()和QTextStream::readLine()。
从QIODevice中重新实现的。
Q_LONG QFile::readLine ( QString & s, Q_ULONG maxlen )
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
读一行文本。
从这个文本中读取最多maxlen字节或者行结束符到字符串s,哪个先发生以哪个为准。返回实际读取的字节数量,或者如果发生错误,返回-1。换行将不会被省略。
这个函数只对缓存文件有效。避免在以IO_Raw标记方式打开的文件中使用readLine()。
注意这个字符串只能作为无格式的Latin1字节来读,不是Unicode。
也可以参考readBlock()和QTextStream::readLine()。
bool QFile::remove ()
移去当前指定文件名的文件。如果成功,返回真,否则返回假。
在文件被移去之前,它被关闭。
bool QFile::remove ( const QString & fileName ) [静态]
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
移去文件fileName。如果成功,返回真,否则返回假。
void QFile::setDecodingFunction ( DecoderFn f ) [静态]
设置8位文件名的译码函数位f。默认使用本地指定的8位编码。
也可以参考encodeName()和decodeName()。
void QFile::setEncodingFunction ( EncoderFn f ) [静态]
设置Unicode文件名的编码函数为f。默认使用本地指定的8位编码。
也可以参考encodeName()。
void QFile::setName ( const QString & name )
设置文件的名称为name。这个名称可以不包含路径,也可以包含相对路径或者绝对路径。如果文件已经被打开,不要调用这个函数。
如果文件名没有路径或者使用相对路径,这是使用的路径就是应用程序在调用open()的时候的当前路径。
实例:
QFile f; QDir::setCurrent( "/tmp" ); f.setName( "readme.txt" ); QDir::setCurrent( "/home" );
f.open( IO_ReadOnly ); // 在Unix下打开“/home/readme.txt”
注意Qt支持在所有的操作系统中使用目录分隔符“/”。
也可以参卡name()、QFileInfo和QDir。
Offset QFile::size () const [虚]
返回文件大小。
也可以参考at()。
实例:table/statistics/statistics.cpp。
从QIODevice中重新实现的。
int QFile::ungetch ( int ch ) [虚]
把字符ch放回到这个文件中并且如果索引位置不是零的话,减一。
这个函数正常地被调用就是“撤销”getch()操作。
返回ch,否则,如果发生错误,返回-1。
也可以参考getch()和putch()。
从QIODevice中重新实现的。
二进制文件的读写文件可以使用QFile类、QStream
文本文件的读写建议使用QTextStream类,它操作文件更加方便。
打开文件时,需要参数指定打开文件的模式:
[plain]view plaincopyprint?
1. C onstant Value Description
2. Q IODevice::NotOpen 0x0000 The device is not open.
3. Q IODevice::ReadOnly 0x0001 The device is open for reading.
4. Q IODevice::WriteOnly 0x0002 The device is open for writing.
5. Q IODevice::ReadWrite ReadOnly | WriteOnly The device is open for reading
and writing.
6. Q IODevice::Append 0x0004 The device is opened in append mode, so that all
data is written to the end of the file.
7. Q IODevice::Truncate 0x0008 If possible, the device is truncated before it is ope
ned. All earlier contents of the device are lost.
8. Q IODevice::Text 0x0010 When reading, the end-of-line terminators are translat
ed to '\n'. When writing, the end-of-line terminators are translated to the local e
ncoding, for example '\r\n' for Win32.
9. Q IODevice::Unbuffered 0x0020 Any buffer in the device is bypassed. QIODevice::Text在读写文本文件时使用,这样可以自动转化换行符为本地换行符。
(1)写入文本文件
[cpp]view plaincopyprint?
1. Q File f("c:\\test.txt");
2. i f(!f.open(QIODevice::WriteOnly | QIODevice::Text))
3. {
4. cout << "Open failed." << endl;
5. return -1;
6. }
7. Q TextStream txtOutput(&f);
8. Q String s1("123");
9. q uint32 n1(123);
10. txtOutput << s1 << endl;
11. txtOutput << n1 << endl;
12. f.close();
写入的文件内容为:
123
123
(2)读取文本文件
[cpp]view plaincopyprint?
1. Q File f("c:\\test.txt");
2. i f(!f.open(QIODevice::ReadOnly | QIODevice::Text))
3. {
4. cout << "Open failed." << endl;
5. return -1;
6. }
7. Q TextStream txtInput(&f);
8. Q String lineStr;
9. w hile(!txtInput.atEnd())
10. {
11. lineStr = txtInput.readLine();
12. cout << lineStr << endl;
13. }
14. f.close();
屏蔽打印的内容为:
123
123
今天学习QT的文件操作
1、QIODevice
直接继承自QObject
QIODevice类是输入/输出设备的基类。
QIODevice为设备提供了公共实现和抽象接口用于读写块数据。
QIODevice是一个抽象类,不能被实例化。
被
Q3Socket,Q3SocketDevice,QAbstractSocket,QBuffer,QFile,QLocalSocket,QNetworkRepl y,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()返回真。
一行一行直接读取文件
Cpp代码
1.QFile file("/home/administrator/testdir/test.txt");
2.if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
3. qDebug()<<"Can't open the file!"< 4.} 5.while(!file.atEnd()) { 6. QByteArray line = file.readLine(); 7. QString str(line); 8. qDebug()<< str; 9.} 使用QTextStream读取文件 Cpp代码 1.QFile file("/proc/modules"); 2. if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) 3. return; 4. 5. QTextStream in(&file); 6. QString line = in.readLine(); 7. while (!line.isNull()) { 8. process_line(line); 9. line = in.readLine(); 10. } 使用QTextStream写入文件 Cpp代码 1.QFile file("out.txt"); 2.if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) 3. return; 4. 5.QTextStream out(&file); 6.out << "The magic number is: " << 49 << "\n"; QDataStream 重载了运算符了"<<"写数据,>>读数据 Cpp代码 1. QFile file("/home/administrator/testdir/test.txt"); 2. if(!file.open(QIODevice::ReadWrite | QIODevice::Text)) { 3. qDebug()<<"Can't open the file!"< 4. } 5. QTextStream stream(&file); 6. QString line_in; 7.// while( !stream.atEnd()){ 8.// line_in = stream.readLine(); 9.// qDebug() << line_in; 10.// } 11.// stream.seek(stream.pos()); 12. stream.seek(file.size());//将当前读取文件指针移动到文件末尾 13.int count = 0; 14. while(count < 10){ 15. stream << QObject::trUtf8("新建行:") <<++count<<"/n"; 16. } 17. stream.seek(0);//将当前读取文件指针移动到文件开始 18. while( !stream.atEnd()){ 19. line_in = stream.readLine(); 20. qDebug() << line_in; 21. } 3、QDir QDir类提供了访问目录结构和他们的内容。 QDir类提供了访问目录结构和它们的内容的与平台无关的方式。 QDir用来操作路径名称、关于路径和文件的访问信息和操作底层文件系统。 QDir使用相对或绝对文件路径来指向一个文件。绝对路径是从目录分隔符“/”或者带有一个驱动器标识(除了在Unix下)。如果你总是使用“/”作为目录分隔符,Qt将会把你的路径转化为符合底层的操作系统的。相对文件名是由一个目录名称或者文件名开始并且指定一个相对于当前路径的路径。 例如绝对路径: QDir("/home/administrator/soft"); QDir("D:/software"); 我们可以使用isRelative()或isAbsolute()函数确认QDir是用的相对路径还是绝对路径。使用makeAbsolute()来转换相对路径的QDir转换成绝对路径的QDir. Cpp代码 1. QDir d("D:/"); 2. d.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks | QDir::AllDirs);//列出文 件,列出隐藏文件(在Unix下就是以.开始的为文件),不列出符号链接(不支持符号连接的操作系统会忽略) 3. d.setSorting(QDir::Size | QDir::Reversed);//按文件大小排序,相反的排序顺序 4. const QFileInfoList list = d.entryInfoList();//返回这个目录中所有目录和文件的 QFileInfo对象的列表 5. QFileInfoList::const_iterator iterator = list.begin(); 6. qDebug() << "目录和文件的数量: " << d.count();//返回找到的目录和文件的数量 7. qDebug() << "fileName/t/t/tsize/t/t/t"; 8. while(iterator != list.end()){ 9. qDebug() << (*iterator).fileName()<<"/t/t/t"<<(*iterator).size(); 10. iterator++; 11. } 12. qDebug() << "当前目录: " << d.current();//返回应用程序当前目录。 13. qDebug() << "当前目录的绝对路径" << d.currentPath();//返回应用程序当前目录的 绝对路径。 14.// const QList 的列表 15.// QList 16.// while(iterator != list.end()){ 17.// qDebug() << (*iterator); 18.// iterator++; 19.// } 运行结果: 4、QFileInfo QFileInfo类提供了一个与平台无关的文件信息. QFileInfo提供了关于系统中的文件名称和位置,访问权限和是否是符号链接,文件大小和上次修改/读写时间等,也能被用于Qt资源文件。 QFileInfo能通过相对/绝对路径指向一个文件。 可以使用isFile(),isDir(),isSymLink().symLinkTarget()函数提供符号链接的目标文件。 在Unix(包括Mac OS X)的符号链接具有与目标文件相同的大小(),因为Unix透明地处理符号链接;同样,打开一个符号连接使用的QFile有效地打开链接的目标. 在Windows中,符号链接(快捷方式)的lnk文件。它大小()的是,符号链接(而不是链接的目标)的大小,打开一个符号连接使用的QFile并打开。lnk文件。例如 Cpp代码 1.#include 2.#include 3.#include 4. 5.int main(int argc, char *argv[]) 6.{ 7. QCoreApplication a(argc, argv); 8. QFileInfo info1("E:/meego/vi_command.lnk"); 9. qDebug() << info1.isSymLink(); 10. qDebug() << info1.absoluteFilePath(); 11. qDebug() << info1.size(); 12. qDebug() << info1.symLinkTarget(); 13. qDebug() << "**********************"; 14. QFileInfo info2(info1.symLinkTarget()); 15. qDebug() << info2.isSymLink(); 16. qDebug() << info2.absoluteFilePath(); 17. qDebug() << info2.size(); 18. 19. return a.exec(); 20.} 运行结果: [cpp]view plaincopy 1.#include 2.#include 3.#include 4.#include 5. 6.int main(int argc, char *argv[]) 7.{ 8. QCoreApplication a(argc, argv); 9. 10. QTextCodec *codec = QTextCodec::codecForName("GB2312"); 11. QTextCodec::setCodecForLocale(codec); 12. QTextCodec::setCodecForCStrings(codec); 13. QTextCodec::setCodecForTr(codec); 14. 15. QFileInfo info("E:/meego/基本命令与https://www.wendangku.net/doc/2b14110421.html,mand.txt"); 16. qDebug() << info.baseName();//不包括后缀名 17. qDebug() << info.bundleName();//只有在Mac OS才有用,其它平台为空 字符串 18. qDebug() << info.suffix();//后缀名 19. qDebug() << https://www.wendangku.net/doc/2b14110421.html,pleteBaseName();//不包括后缀名 20. qDebug() << https://www.wendangku.net/doc/2b14110421.html,pleteSuffix();//完整的后缀名 21.return a.exec(); 22.} 运行结果: