QFile类是一个操作文件的输入/输出设备。详情请见……
#include
继承了 QIODevice。
所有成员函数的列表。
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( "%3d: %s\n", n++, line.latin1() ); 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::setDecodingFunction()使用。
被QFile::setEncodingFunction()使用。
也可以参考setName()。
实例:
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中重新实现的。
返回文件中的位置。
也可以参考size()。
从QIODevice中重新实现的。
也可以参考size()。
从QIODevice中重新实现的。
如果一个文件是使用一个存在的文件句柄打开的,那么它不是关闭的。如果这个存在的文件句柄是一个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中重新实现的。
也可以参考setDecodingFunction()。
默认情况下,这个函数把fileName转换为本地的8位编码,这取决于用户的场所设置。对于用户选择的文件名这足够了。应用程序中的文件名硬编码只是需要使用7位ASCII文件名字符。
这种转换方案可以使用setEncodingFunction()来改变。如果你需要给用户一个存储文件名为utf-8等等情况下,这也许很有用,但是这些文件名可能在这之后对其它应用程序来说是不可识别的。
也可以参考decodeName()。
实例:chart/chartform.cpp、dirview/dirview.cpp和helpviewer/helpwindow.cpp。
如果这个文件存在,返回真,否则返回假。
也可以参考name()。
close()也刷新文件缓存。
从QIODevice中重新实现的。
返回所读的字节/字符,如果到达文件的末尾,返回-1。
也可以参考putch()和ungetch()。
从QIODevice中重新实现的。
如果是一个小的正整数,可以用在像fdopen()和fcntl()这样的C库函数中,也可以用在QSocketNotifier中。
如果这个文件没有被打开或者存在错误,handle()返回-1。
也可以参考QSocketNotifier。
也可以参考setName()和QFileInfo::fileName()。
模式参数m必须是下列标记的组合:
直接访问模式在输入/输出的块操作使用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中重新实现的。
使用m模式和一个存在的文件句柄f打开文件。如果成功,返回真,否则返回假。
实例:
#includevoid printError( const char* msg ) { QFile f; f.open( IO_WriteOnly, stderr ); f.writeBlock( msg, qstrlen(msg) ); // 写到标准错误输出(stderr) f.close(); }
当使用这个函数打开一个QFile时,close()并不真正关闭这个文件,只是刷新它。
警告:如果f是标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr),你也许不能搜索。更详细的信息请看QIODevice::isSequentialAccess()。
也可以参考close()。
使用m模式和一个存在的文件描述符f打开文件。如果成功,返回真,否则返回假。
当使用这个函数打开一个QFile时,close()并不真正关闭这个文件。
使用这个函数打开一个QFile时,它被自动设置为直接模式,这就意味着文件输入/输出函数是慢的。如果你需要更好的执行效率,请你试着使用其它打开函数。
警告:如果f是0(stdin)、1(stdout)或2(stderr)其中之一时,你也许不能搜索。size()被设置为INT_MAX(在limits.h文件中)。
也可以参考close()。
返回ch,或者如果发生错误,返回-1。
也可以参考getch()和ungetch()。
从QIODevice中重新实现的。
如果发生严重错误,返回-1。
警告:当一个缓存文件为了读写而打开时,我们已经在使用一些C库时遇到了问题。如果在一个写操作后立即执行一个读操作,读缓存中就会包含无用信息。更可怕的是,一些无用信息被写到文件中。在readBlock()之前调用flush()就可以解决这个问题。
也可以参考writeBlock()。
实例:qwerty/qwerty.cpp。
从QIODevice中重新实现的。
从这个文本中读取最多maxlen字节或者行结束符到p,哪个先发生以哪个为准。返回实际读取的字节数量,或者如果发生错误,返回-1。换行将不会被省略。
这个函数只对缓存文件有效。避免在以IO_Raw标记方式打开的文件中使用readLine()。
也可以参考readBlock()和QTextStream::readLine()。
从QIODevice中重新实现的。
读一行文本。
从这个文本中读取最多maxlen字节或者行结束符到字符串s,哪个先发生以哪个为准。返回实际读取的字节数量,或者如果发生错误,返回-1。换行将不会被省略。
这个函数只对缓存文件有效。避免在以IO_Raw标记方式打开的文件中使用readLine()。
注意这个字符串只能作为无格式的Latin1字节来读,不是Unicode。
也可以参考readBlock()和QTextStream::readLine()。
在文件被移去之前,它被关闭。
移去文件fileName。如果成功,返回真,否则返回假。
也可以参考encodeName()和decodeName()。
也可以参考encodeName()。
如果文件已经被打开,不要调用这个函数。
如果文件名没有路径或者使用相对路径,这是使用的路径就是应用程序在调用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。
也可以参考at()。
实例:table/statistics/statistics.cpp。
从QIODevice中重新实现的。
把字符ch放回到这个文件中并且如果索引位置不是零的话,减一。
这个函数正常地被调用就是“撤销”getch()操作。
返回ch,否则,如果发生错误,返回-1。
也可以参考getch()和putch()。
从 QIODevice中重新实现的。