作者:帅得不敢出门 c++哈哈堂31843264
不多说,看源码.
首先qpe 中会进行/etc/mtab的检测.
void SysFileMonitor::timerEvent(QTimerEvent*) // 这里只列出部分检测代码
{
// st_size is no use, it's 0 for /proc/mounts too. Read it all.
static int mtabSize = 0;
QFile f( "/etc/mtab" );
if ( f.open(IO_ReadOnly) ) {
QString s;
while( !f.atEnd() ) {
QString tmp;
f.readLine( tmp, 1024 );
s += tmp;
}
if ( (int)s.length() != mtabSize ) { // 对文件大小进行对比, 不相等说明/etc/mtab有变动, 然后通知其他程序.
mtabSize = (int)s.length();
#ifndef QT_NO_COP
QCopEnvelope("QPE/Card", "mtabChanged()" );
#endif
}
}
qtopia 中有个StorageInfo类(其他子程序可以通过它来接收/etc/mtab有变动的通知),
StorageInfo::StorageInfo( QObject *parent )
: QObject( parent ){
#ifndef QT_NO_COP
channel = new QCopChannel( "QPE/Card", this );
connect( channel, SIGNAL(received(const QCString&,const QByteArray&)),
this, SLOT(cardMessage(const QCString&,const QByteArray&)) );
#endif
update();
}
void StorageInfo::cardMessage( const QCString& msg, const QByteArray& )
{
if ( msg == "mtabChanged()" )
update();
}
比如插入sd卡,并 mount到/sdcard后.
/etc/mtab下会添加类似/dev/mmcblk0p1 /sdcard vfat rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0
的文本
update()中,会分析这个/etc/mtab
如果该目录是已存在 则emit disksChanged();信号. 告诉程序,磁盘发生改变.
程序会由这个信号进行数据更新, 示例代码如下:
StorageInfo *storage_info = new StorageInfo(this);