转载自:
Symbian (Backup sis on installing)安装时备份SIS
备份自己是一个很有技巧的技术点
我{zx0}发现使用此技巧的是搜狗输入法
搜狗输入法有一个功能是可以用bluetooth共享给好友
后来调研了好久不知道如何做到的.
感谢陈子腾大神的总结
在这里也总结一下做个备忘,也让更多的朋友也能学习了解一下
首先我们来看,安装文件的时候我们需要知道啥时候自己被安装了.
因为安装程序不允许多实力安装.也就是说同一时刻只能有一个安装
程序安装.
这样我们就可以在程序安装的时候得到自己的名字.然后再进行备份了.
那么如何知道自己被安装了呢.
TOpenFileScan可以枚举得到所有打开的文件.
//下面是找到当前正在安装的名字
RFs fs;
TInt err = fs.Connect();
User::LeaveIfError(err);
CleanupClosePushL(fs);
TFileName filename;
TOpenFileScan ofs(fs);
TBool done = EFalse;
//枚举所有打开的文件
while (!done)
{
CFileList* fl= NULL;
ofs.NextL(fl);
if (fl==NULL)
{
done = ETrue;
}
else
{
CleanupStack::PushL(fl);
TInt count = fl->Count();
for (TInt i= 0; (i<count)&&(!done); i++)
{
_LIT(KExtSis, ".sis");
_LIT(KExtSisx, ".sisx");
TEntry entry = (*fl)[i];
TParsePtrC parse(entry.iName);
//当前打开的文件后缀名为SIS的.把名字保存下来
if ((parse.Ext()==KExtSis)||(parse.Ext()==KExtSisx))
{
filename = entry.iName;
done = ETrue;
}
}
CleanupStack::PopAndDestroy(fl);
}
}
///以上就可以找到已经安装的自己的名字了.
然后再让我们看看有哪些安装形式
1.数据线安装
2.蓝牙安装
3.安装SIS在手机上进行直接安装
我们先来看看以下安装的几种情况
1.数据线安装(PC套件会把SIS在手机上copy一份)
2.蓝牙安装(可以通过API取到附件中的SIS)
3.Copy到手机上直接安装(直接搜索可以找到)
让我们看如何处理
_LIT(KSisBackup, "c:\\data\\backup.sis");
if(filename!=KNullDesC)
{
BaflUtils::EnsurePathExistsL(fs, KSisBackup);
_LIT(KMessagingPrivateFolder, "\\private\\1000484b\\");
_LIT(KPrivateFolder, "\\private\\");
filename.LowerCase();
if(filename.Find(KMessagingPrivateFolder)==0)
{
//在信息目录里.可以通过API取出附件中的文件
// Messaging application's private folder
// try to retrieve the message attachment
CSmsHandler* sms = CSmsHandler::NewLC(); // need active scheduler
sms->ExportInboxToFileL(fs, filename, KSisBackup);
CleanupStack::PopAndDestroy(sms);
}
else if(filename.Find(KPrivateFolder)==0)
{
//在私有目录下.没有办法取得
//如果SIS在私有目录下,就说明在安装的过程中只能通过其他程序
//安装,如果通过其他程序安装
// other private folder
// no idea how to get the sis file
}
else//已经在手机上
{
_LIT(KDriveC, "c:");
filename.Insert(0, KDriveC);
// other folders
TBool found = EFalse;
TDriveList driveList;
err = fs.DriveList(driveList);
User::LeaveIfError(err);
//查找所有盘符,取出路径
for(TInt driveNumber=EDriveA; (driveNumber<EDriveZ)&&(!found); driveNumber++)
{
if (driveList[driveNumber])
{
TChar driveLetter;
err = fs.DriveToChar(driveNumber,driveLetter);
User::LeaveIfError(err);
filename[0] = driveLetter;
TEntry entry;
err = fs.Entry(filename, entry);
if(err==KErrNone)
{
err = fs.SetModified(filename, entry.iModified);
if(err!=KErrNone) // KErrInUse, or KErrPermissionDenied if the file is in "\\resource\\"
{
found = ETrue;
}
}
}
}
//找到后copy一份文件即可
if(found)
{
err = BaflUtils::CopyFile(fs, filename, KSisBackup);
User::LeaveIfError(err);
}
以上代码在N95上测试通过