技术开发 频道

Symbian 安装时备份SIS的实现

  【IT168 技术】Symbian (Backup sis on installing)安装时备份SIS

  备份自己是一个很有技巧的技术点

  我最先发现使用此技巧的是搜狗输入法

  搜狗输入法有一个功能是可以用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<>

  {

  _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:dataackup.sis");

  if(filename!=KNullDesC)

  {

  BaflUtils::EnsurePathExistsL(fs, KSisBackup);

  _LIT(KMessagingPrivateFolder, "private1000484b\");

  _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<>

  {

  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 " esource\"

  {

  found = ETrue;

  }

  }

  }

  }

  //找到后copy一份文件即可

  if(found)

  {

  err = BaflUtils::CopyFile(fs, filename, KSisBackup);

  User::LeaveIfError(err);

  }

0
相关文章