📄 m3directory.cpp
字号:
/*
* Copyright (c) 2007,苏州丰达
* All rights reserved.
* 版权所有(C)2007-2008 苏州丰达
* 公司地址:中国,江苏省苏州市
* 网址:http://www.
*
* 文件名称:M3Directory.cpp
* 摘 要:
*
* 产品版本:彩视 1.0
*
* 作 者:xxxx
* 创建日期:xxxxx
* 负责人:xxxxx
*
* 修改者:司治国
* 修改日期:2008.1.17
*
* 编译器或环境等描述:uiqsdk2.1
* 适用于VC2003+symbian 7.x的环境开发。
*
**/
#include "M3Directory.h"
#include "M3ScanObject.h"
_LIT(KPath, "%S%S");
_LIT(KPathMask, "%S%S\\");
/*
* 默认构造
*/
M3Directory::M3Directory() : iHasDrive(EFalse), iNumSelected(0), iZip(NULL)
{
}
M3Directory::~M3Directory()
{
DelTemporary();
if (iTxtArray)
{
iTxtArray->Reset();
delete iTxtArray;
iTxtArray = NULL;
}
if (iParse)
{
delete iParse;
iParse = NULL;
}
if (iFmgr)
{
delete iFmgr;
iFmgr = NULL;
}
if (iSelected)
{
iSelected->Reset();
delete iSelected;
iSelected = NULL;
}
if (iTemporary)
{
iTemporary->Reset();
delete iTemporary;
iTemporary = NULL;
}
if (iZip)
{
delete iZip;
}
if (iFs)
{
iFs->Close();
delete iFs;
iFs = NULL;
}
}
void M3Directory::GetList(CDesCArray *aTxtArray)
{
aTxtArray->Reset();
iTxtArray->Reset();
if (!iHasDrive)
{
GetDriveList(aTxtArray);
}
else if (InZipFile())
{
GetZipList(aTxtArray);
}
else
{
GetDirList(aTxtArray);
}
}
/*
* 得到盘符列表
* @param aTxtArray
*/
void M3Directory::GetDriveList(CDesCArray *aTxtArray)
{
TDriveList aList;
iFs->DriveList(aList);
for (TInt i = 0; i < KMaxDrives; i++)
{
if (aList[i])
{
TChar aDrive;
iFs->DriveToChar(i, aDrive);
TBuf<KMaxDirSize> item;
item.Format(_L("2 \t%c:"), aDrive);
aTxtArray->AppendL(item);
item.Format(_L("%c"), aDrive);
iTxtArray->AppendL(item);
}
}
}
/*
* 得到目录列表
*/
void M3Directory::GetDirList(CDesCArray *txtArray)
{
TPtrC aName = iParse->DriveAndPath();
CDir *aFileList;
txtArray->AppendL(_L("2\t.."));
iTxtArray->AppendL(_L(".."));
if (iFs->GetDir(aName, KEntryAttMaskSupported, EDirsFirst | ESortByName, aFileList) != KErrNone)
{
return ;
}
for (TInt i = 0; i < aFileList->Count(); i++)
{
TEntry aEntry = (*aFileList)[i];
TBuf<KMaxDirSize> item;
if (aEntry.IsDir())
{
item.Format(_L("2\t[%S]"), &aEntry.iName);
}
else
{
item.Format(_L("1\t%S"), &aEntry.iName);
}
if (IsSelected(i + 1))
{
TBuf<KMaxDirSize> item_tmp;
item_tmp.Copy(item);
item.Format(_L("* %S"), &item_tmp);
}
txtArray->AppendL(item);
item.Format(_L("%S"), &(*aFileList)[i].iName);
iTxtArray->AppendL(item);
}
delete aFileList;
aFileList = NULL;
}
TInt M3Directory::EnterItem(TInt idx)
{
DelTemporary();
TPtrC itemtxt = (*iTxtArray)[idx];
if (!iHasDrive)
{
TBuf<KMaxDirSize> dir;
dir.Format(_L("%c:\\"), itemtxt[0]);
iParse->Set(dir, NULL, NULL);
iHasDrive = ETrue;
}
else if (idx == 0)
{
UpDir();
}
else if (IsDir(itemtxt))
{
iParse->AddDir(itemtxt);
}
else if (InZipFile())
{
TPtrC tmp = _L("$$tmp$$");
MkDir(tmp);
iParse->AddDir(tmp);
CopyZip(itemtxt, GetPath());
StartDocument(idx);
iTemporary->AppendL(GetPath());
iParse->PopDir();
return 0;
}
else
{
TParse parse;
parse.Set(itemtxt, NULL, NULL);
TBuf<4> ext = parse.Ext();
ext.LowerCase();
if (!ext.Compare(_L(".zip")))
{
OpenZip(itemtxt);
}
else
{
StartDocument(idx);
return 0;
}
}
return 1;
}
TInt M3Directory::StartDocument(TInt idx)
{
TBuf<KMaxDirSize> file;
file.Format(KPath, &GetPath(), &GetFile(idx));
if (file.Length() > KMaxDirSize)
{
return 0;
}
RApaLsSession rSession;
TThreadId iThread;
rSession.Connect();
rSession.StartDocument(file, iThread);
rSession.Close();
return 0;
}
void M3Directory::UpDir()
{
if (InZipFile())
{
iParse->Set(GetPath(), NULL, NULL);
CloseZip();
}
else if (iParse->IsRoot())
{
iHasDrive = EFalse;
}
else
{
iParse->PopDir();
}
}
TPtrC M3Directory::GetPath()
{
return iParse->DriveAndPath();
}
TPtrC M3Directory::GetFile(TInt idx)
{
return (*iTxtArray)[idx];
}
TParse * M3Directory::GetParse()
{
return iParse;
}
TInt M3Directory::FindPath(TPtrC path)
{
TInt i;
TPtrC aPath = iParse->DriveAndPath();
TBuf<KMaxDirSize> dir;
for (i = 1; i < iTxtArray->Count(); i++)
{
TPtrC itemTxt = (*iTxtArray)[i];
dir.Format(KPathMask, &aPath, &itemTxt);
if (!dir.Compare(path))
{
return i;
}
}
return 0;
}
TBool M3Directory::SetPath(TPtrC path)
{
iParse->Set(path, NULL, NULL);
iHasDrive = iParse->DrivePresent();
return iHasDrive;
}
TBool M3Directory::HasDrive()
{
return iHasDrive;
}
TBool M3Directory::InZipFile()
{
return iZip != NULL;
}
TBool M3Directory::IsDir(TPtrC file)
{
TPtrC aPath = iParse->DriveAndPath();
TBuf<KMaxDirSize> dir;
dir.Format(KPath, &aPath, &file);
TEntry fileEntry;
iFs->Entry(dir, fileEntry);
if (fileEntry.IsDir())
{
return ETrue;
}
return EFalse;
}
TBool M3Directory::IsSelected(TInt idx)
{
if (iSelected->Count() <= idx)
{
return EFalse;
}
return (*iSelected)[idx];
}
TInt M3Directory::SelectedCount()
{
return iNumSelected;
}
void M3Directory::ClearSelection()
{
iSelected->Reset();
iNumSelected = 0;
}
TInt M3Directory::DeleteFile(TInt idx, TBool rec/* =EFalse */)
{
TPtrC src = (*iTxtArray)[idx];
TBuf<KMaxDirSize> dir;
dir.Format(_L("%S\\"), &src);
iFs->SetSessionPath(GetPath());
if (!IsDir(src))
{
iFmgr->Delete(src);
}
else
{
if (rec)
{
M3DfsDelete fo(iFs);
FileDfs(&fo, dir);
}
else if (iFs->RmDir(dir) != KErrNone)
{
return 1;
}
}
return 0;
}
TInt M3Directory::MkDir(TPtrC newDir)
{
TPtrC path = GetPath();
TBuf<KMaxDirSize> dir;
dir.Format(KPathMask, &path, &newDir);
iFs->MkDir(dir);
return 0;
}
void M3Directory::FileDfs(M3ScanObject *fo, TPtrC path)
{
if (!fo->EnterDirectory(path))
{
return;
}
CDir *aFileList;
if (iFs->GetDir(path, KEntryAttMaskSupported, EDirsFirst | ESortByName, aFileList) != KErrNone)
{
return;
}
for (TInt i = 0; i < aFileList->Count(); i++)
{
TEntry aEntry = (*aFileList)[i];
if (aEntry.IsDir())
{
fo->FileAction(path, aEntry.iName);
}
else
{
TBuf<KMaxDirSize> newPath;
newPath.Format(KPathMask, &path, &aEntry.iName);
}
}
fo->LeaveAction(path);
}
void M3Directory::OpenZip(TPtrC zip)
{
TBuf<KMaxDirSize> fullname;
fullname.Format(KPath, &GetPath(), &zip);
iZip = new CZipFile(*iFs, fullname);
iZip->OpenL();
}
void M3Directory::CloseZip()
{
iZip->Close();
delete iZip;
iZip = NULL;
}
void M3Directory::CopyZip(TPtrC src, TPtrC trg)
{
CZipFileMember *entry = iZip->MemberL(src);
CleanupStack::PushL(entry);
RZipFileMemberReaderStream *iStream;
User::LeaveIfError(iZip->GetInputStreamL(entry, iStream));
CleanupStack::PushL(iStream);
TFileName name;
name.Append(trg);
name.Append(src);
TInt err = iFs->MkDirAll(name);
if (err != KErrNone && err != KErrAlreadyExists)
{
User::Leave(err);
}
RFile out;
User::LeaveIfError(out.Replace(*iFs, name, EFileShareAny | EFileWrite));
CleanupClosePushL(out);
//out.Create(*iFs,src,EFileWrite);
TUint32 size = entry->UncompressedSize();
HBufC8 *data = HBufC8::NewLC(size);
TPtr8 p = data->Des();//Obtain a modifiable descriptor
iStream->Read(p, size);
User::LeaveIfError(out.Write(p));
/*
while(iStream->Read(chr,512)==KErrNone)
out.Write(chr);
out.Write(chr);
out.Flush();
out.Close();
//iStream->Close();
*/
CleanupStack::PopAndDestroy(4);//?
}
TInt M3Directory::GetFileSizeL(TPtrC fname)
{
RFile tmpFile;
TInt aSize = 0;
if (iFs)
{
User::LeaveIfError(tmpFile.Open(*iFs, fname, EFileRead | EFileStream));
}
CleanupClosePushL(tmpFile);
tmpFile.Seek(ESeekEnd, aSize);
CleanupStack::PopAndDestroy();
return aSize;
}
void M3Directory::GetZipList(CDesCArray *txtArray)
{
txtArray->AppendL(_L("8\t.."));
iTxtArray->AppendL(_L(".."));
TBuf<KMaxDirSize> item;
CZipFileMemberIterator *entries = iZip->GetMembersL();
CleanupStack::PushL(entries);
CZipFileMember *entry;
TInt i = 1;
while (entry = entries->NextL())
{
CleanupStack::PushL(entry);
const TFileName *name = entry->Name();
item.Format(_L("7\t%S"), name);
if (IsSelected(i++))
{
TBuf<KMaxDirSize> item_tmp;
item_tmp.Copy(item);
item.Format(_L("* %S"), &item_tmp);
}
txtArray->AppendL(item);
item.Format(_L("%S"), name);
iTxtArray->AppendL(item);
CleanupStack::PopAndDestroy();//entry
}
CleanupStack::PopAndDestroy();//entries
}
void M3Directory::DelTemporary()
{
for (TInt i = 0; i < iTemporary->Count(); i++)
{
M3DfsDelete fo(iFs);
FileDfs(&fo, (*iTemporary)[i]);
}
iTemporary->Reset();
}
/*
* 二步构造
*/
M3Directory* M3Directory::newL()
{
M3Directory* m3dir = new(ELeave) M3Directory();
CleanupStack::PushL(m3dir);
m3dir->ConstructL();
CleanupStack::Pop(); // self;
return m3dir;
}
void M3Directory::ConstructL()
{
//声明文件会话指针
iFs = new (ELeave) RFs();
//会话连接
iFs->Connect();
iParse = new (ELeave) TParse();
iTxtArray = new (ELeave) CDesCArrayFlat(16);
iFmgr = CFileMan::NewL(*iFs);
iSelected = new CArrayFixFlat<TInt>(16);
iTemporary = new (ELeave) CDesCArrayFlat(2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -