mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 11:14:58 -06:00
9.06 beta
This commit is contained in:
committed by
Kornel Lesiński
parent
829409452d
commit
c99f3ebdd6
@@ -14,7 +14,11 @@
|
||||
|
||||
#include "FSDrives.h"
|
||||
#include "FSFolder.h"
|
||||
|
||||
#ifndef UNDER_CE
|
||||
#include "NetFolder.h"
|
||||
#endif
|
||||
|
||||
#include "SysIconUtils.h"
|
||||
|
||||
namespace NWindows {
|
||||
@@ -61,8 +65,8 @@ HRESULT CFSFolder::Init(const UString &path, IFolderFolder *parentFolder)
|
||||
{
|
||||
DWORD lastError = GetLastError();
|
||||
CFindFile findFile;
|
||||
CFileInfoW fileInfo;
|
||||
if (!findFile.FindFirst(_path + UString(L"*"), fileInfo))
|
||||
CFileInfoW fi;
|
||||
if (!findFile.FindFirst(_path + UString(L"*"), fi))
|
||||
return lastError;
|
||||
}
|
||||
return S_OK;
|
||||
@@ -73,13 +77,13 @@ HRESULT GetFolderSize(const UString &path, UInt64 &numFolders, UInt64 &numFiles,
|
||||
RINOK(progress->SetCompleted(NULL));
|
||||
numFiles = numFolders = size = 0;
|
||||
CEnumeratorW enumerator(path + UString(WSTRING_PATH_SEPARATOR L"*"));
|
||||
CFileInfoW fileInfo;
|
||||
while (enumerator.Next(fileInfo))
|
||||
CFileInfoW fi;
|
||||
while (enumerator.Next(fi))
|
||||
{
|
||||
if (fileInfo.IsDir())
|
||||
if (fi.IsDir())
|
||||
{
|
||||
UInt64 subFolders, subFiles, subSize;
|
||||
RINOK(GetFolderSize(path + UString(WCHAR_PATH_SEPARATOR) + fileInfo.Name, subFolders, subFiles, subSize, progress));
|
||||
RINOK(GetFolderSize(path + UString(WCHAR_PATH_SEPARATOR) + fi.Name, subFolders, subFiles, subSize, progress));
|
||||
numFolders += subFolders;
|
||||
numFolders++;
|
||||
numFiles += subFiles;
|
||||
@@ -88,7 +92,7 @@ HRESULT GetFolderSize(const UString &path, UInt64 &numFolders, UInt64 &numFiles,
|
||||
else
|
||||
{
|
||||
numFiles++;
|
||||
size += fileInfo.Size;
|
||||
size += fi.Size;
|
||||
}
|
||||
}
|
||||
return S_OK;
|
||||
@@ -98,21 +102,23 @@ HRESULT CFSFolder::LoadSubItems(CDirItem &dirItem, const UString &path)
|
||||
{
|
||||
{
|
||||
CEnumeratorW enumerator(path + L"*");
|
||||
CDirItem fileInfo;
|
||||
while (enumerator.Next(fileInfo))
|
||||
CDirItem fi;
|
||||
while (enumerator.Next(fi))
|
||||
{
|
||||
fileInfo.CompressedSizeIsDefined = false;
|
||||
#ifndef UNDER_CE
|
||||
fi.CompressedSizeIsDefined = false;
|
||||
/*
|
||||
if (!GetCompressedFileSize(_path + fileInfo.Name,
|
||||
fileInfo.CompressedSize))
|
||||
fileInfo.CompressedSize = fileInfo.Size;
|
||||
if (!GetCompressedFileSize(_path + fi.Name,
|
||||
fi.CompressedSize))
|
||||
fi.CompressedSize = fi.Size;
|
||||
*/
|
||||
if (fileInfo.IsDir())
|
||||
#endif
|
||||
if (fi.IsDir())
|
||||
{
|
||||
// fileInfo.Size = GetFolderSize(_path + fileInfo.Name);
|
||||
fileInfo.Size = 0;
|
||||
// fi.Size = GetFolderSize(_path + fi.Name);
|
||||
fi.Size = 0;
|
||||
}
|
||||
dirItem.Files.Add(fileInfo);
|
||||
dirItem.Files.Add(fi);
|
||||
}
|
||||
}
|
||||
if (!_flatMode)
|
||||
@@ -237,7 +243,8 @@ STDMETHODIMP CFSFolder::GetNumberOfSubFolders(UInt32 *numSubFolders)
|
||||
}
|
||||
*/
|
||||
|
||||
bool MyGetCompressedFileSizeW(LPCWSTR fileName, UInt64 &size)
|
||||
#ifndef UNDER_CE
|
||||
static bool MyGetCompressedFileSizeW(LPCWSTR fileName, UInt64 &size)
|
||||
{
|
||||
DWORD highPart;
|
||||
DWORD lowPart = ::GetCompressedFileSizeW(fileName, &highPart);
|
||||
@@ -256,46 +263,49 @@ bool MyGetCompressedFileSizeW(LPCWSTR fileName, UInt64 &size)
|
||||
size = (UInt64(highPart) << 32) | lowPart;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
STDMETHODIMP CFSFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value)
|
||||
{
|
||||
NCOM::CPropVariant prop;
|
||||
if (itemIndex >= (UInt32)_refs.Size())
|
||||
return E_INVALIDARG;
|
||||
CDirItem &fileInfo = *_refs[itemIndex];
|
||||
CDirItem &fi = *_refs[itemIndex];
|
||||
switch(propID)
|
||||
{
|
||||
case kpidIsDir: prop = fileInfo.IsDir(); break;
|
||||
case kpidName: prop = fileInfo.Name; break;
|
||||
case kpidSize: if (!fileInfo.IsDir()) prop = fileInfo.Size; break;
|
||||
case kpidIsDir: prop = fi.IsDir(); break;
|
||||
case kpidName: prop = fi.Name; break;
|
||||
case kpidSize: if (!fi.IsDir()) prop = fi.Size; break;
|
||||
case kpidPackSize:
|
||||
if (!fileInfo.CompressedSizeIsDefined)
|
||||
#ifdef UNDER_CE
|
||||
prop = fi.Size;
|
||||
#else
|
||||
if (!fi.CompressedSizeIsDefined)
|
||||
{
|
||||
fileInfo.CompressedSizeIsDefined = true;
|
||||
if (fileInfo.IsDir () ||
|
||||
!MyGetCompressedFileSizeW(_path + GetRelPath(fileInfo), fileInfo.CompressedSize))
|
||||
fileInfo.CompressedSize = fileInfo.Size;
|
||||
fi.CompressedSizeIsDefined = true;
|
||||
if (fi.IsDir () ||
|
||||
!MyGetCompressedFileSizeW(_path + GetRelPath(fi), fi.CompressedSize))
|
||||
fi.CompressedSize = fi.Size;
|
||||
}
|
||||
prop = fileInfo.CompressedSize;
|
||||
prop = fi.CompressedSize;
|
||||
#endif
|
||||
break;
|
||||
case kpidAttrib: prop = (UInt32)fileInfo.Attrib; break;
|
||||
case kpidCTime: prop = fileInfo.CTime; break;
|
||||
case kpidATime: prop = fileInfo.ATime; break;
|
||||
case kpidMTime: prop = fileInfo.MTime; break;
|
||||
case kpidAttrib: prop = (UInt32)fi.Attrib; break;
|
||||
case kpidCTime: prop = fi.CTime; break;
|
||||
case kpidATime: prop = fi.ATime; break;
|
||||
case kpidMTime: prop = fi.MTime; break;
|
||||
case kpidComment:
|
||||
{
|
||||
LoadComments();
|
||||
UString comment;
|
||||
if (_comments.GetValue(GetRelPath(fileInfo), comment))
|
||||
if (_comments.GetValue(GetRelPath(fi), comment))
|
||||
prop = comment;
|
||||
break;
|
||||
}
|
||||
case kpidPrefix:
|
||||
{
|
||||
if (_flatMode)
|
||||
{
|
||||
prop = GetPrefix(fileInfo);
|
||||
}
|
||||
prop = GetPrefix(fi);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -333,10 +343,10 @@ UString CFSFolder::GetRelPath(const CDirItem &item) const
|
||||
STDMETHODIMP CFSFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolder)
|
||||
{
|
||||
*resultFolder = 0;
|
||||
const CDirItem &fileInfo = *_refs[index];
|
||||
if (!fileInfo.IsDir())
|
||||
const CDirItem &fi = *_refs[index];
|
||||
if (!fi.IsDir())
|
||||
return E_INVALIDARG;
|
||||
return BindToFolderSpec(GetRelPath(fileInfo), resultFolder);
|
||||
return BindToFolderSpec(GetRelPath(fi), resultFolder);
|
||||
}
|
||||
|
||||
STDMETHODIMP CFSFolder::BindToFolder(const wchar_t *name, IFolderFolder **resultFolder)
|
||||
@@ -362,15 +372,19 @@ STDMETHODIMP CFSFolder::BindToParentFolder(IFolderFolder **resultFolder)
|
||||
pos = parentPath.ReverseFind(WCHAR_PATH_SEPARATOR);
|
||||
if (pos < 0)
|
||||
{
|
||||
parentPath.Empty();
|
||||
#ifdef UNDER_CE
|
||||
*resultFolder = 0;
|
||||
#else
|
||||
CFSDrives *drivesFolderSpec = new CFSDrives;
|
||||
CMyComPtr<IFolderFolder> drivesFolder = drivesFolderSpec;
|
||||
drivesFolderSpec->Init();
|
||||
*resultFolder = drivesFolder.Detach();
|
||||
#endif
|
||||
return S_OK;
|
||||
}
|
||||
UString parentPathReduced = parentPath.Left(pos);
|
||||
parentPath = parentPath.Left(pos + 1);
|
||||
#ifndef UNDER_CE
|
||||
pos = parentPathReduced.ReverseFind(WCHAR_PATH_SEPARATOR);
|
||||
if (pos == 1)
|
||||
{
|
||||
@@ -382,6 +396,7 @@ STDMETHODIMP CFSFolder::BindToParentFolder(IFolderFolder **resultFolder)
|
||||
*resultFolder = netFolder.Detach();
|
||||
return S_OK;
|
||||
}
|
||||
#endif
|
||||
CFSFolder *parentFolderSpec = new CFSFolder;
|
||||
CMyComPtr<IFolderFolder> parentFolder = parentFolderSpec;
|
||||
RINOK(parentFolderSpec->Init(parentPath, 0));
|
||||
@@ -457,11 +472,11 @@ HRESULT CFSFolder::GetItemsFullSize(const UInt32 *indices, UInt32 numItems,
|
||||
int index = indices[i];
|
||||
if (index >= _refs.Size())
|
||||
return E_INVALIDARG;
|
||||
const CDirItem &fileInfo = *_refs[index];
|
||||
if (fileInfo.IsDir())
|
||||
const CDirItem &fi = *_refs[index];
|
||||
if (fi.IsDir())
|
||||
{
|
||||
UInt64 subFolders, subFiles, subSize;
|
||||
RINOK(GetFolderSize(_path + GetRelPath(fileInfo), subFolders, subFiles, subSize, progress));
|
||||
RINOK(GetFolderSize(_path + GetRelPath(fi), subFolders, subFiles, subSize, progress));
|
||||
numFolders += subFolders;
|
||||
numFolders++;
|
||||
numFiles += subFiles;
|
||||
@@ -470,7 +485,7 @@ HRESULT CFSFolder::GetItemsFullSize(const UInt32 *indices, UInt32 numItems,
|
||||
else
|
||||
{
|
||||
numFiles++;
|
||||
size += fileInfo.Size;
|
||||
size += fi.Size;
|
||||
}
|
||||
}
|
||||
return S_OK;
|
||||
@@ -478,8 +493,8 @@ HRESULT CFSFolder::GetItemsFullSize(const UInt32 *indices, UInt32 numItems,
|
||||
|
||||
HRESULT CFSFolder::GetItemFullSize(int index, UInt64 &size, IProgress *progress)
|
||||
{
|
||||
const CDirItem &fileInfo = *_refs[index];
|
||||
if (fileInfo.IsDir())
|
||||
const CDirItem &fi = *_refs[index];
|
||||
if (fi.IsDir())
|
||||
{
|
||||
/*
|
||||
CMyComPtr<IFolderFolder> subFolder;
|
||||
@@ -499,9 +514,9 @@ HRESULT CFSFolder::GetItemFullSize(int index, UInt64 &size, IProgress *progress)
|
||||
}
|
||||
*/
|
||||
UInt64 numFolders, numFiles;
|
||||
return GetFolderSize(_path + GetRelPath(fileInfo), numFolders, numFiles, size, progress);
|
||||
return GetFolderSize(_path + GetRelPath(fi), numFolders, numFiles, size, progress);
|
||||
}
|
||||
size = fileInfo.Size;
|
||||
size = fi.Size;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -560,9 +575,9 @@ STDMETHODIMP CFSFolder::CreateFile(const wchar_t *name, IProgress * /* progress
|
||||
|
||||
STDMETHODIMP CFSFolder::Rename(UInt32 index, const wchar_t *newName, IProgress * /* progress */)
|
||||
{
|
||||
const CDirItem &fileInfo = *_refs[index];
|
||||
const UString fullPrefix = _path + GetPrefix(fileInfo);
|
||||
if (!NDirectory::MyMoveFile(fullPrefix + fileInfo.Name, fullPrefix + newName))
|
||||
const CDirItem &fi = *_refs[index];
|
||||
const UString fullPrefix = _path + GetPrefix(fi);
|
||||
if (!NDirectory::MyMoveFile(fullPrefix + fi.Name, fullPrefix + newName))
|
||||
return GetLastError();
|
||||
return S_OK;
|
||||
}
|
||||
@@ -572,10 +587,10 @@ STDMETHODIMP CFSFolder::Delete(const UInt32 *indices, UInt32 numItems,IProgress
|
||||
RINOK(progress->SetTotal(numItems));
|
||||
for (UInt32 i = 0; i < numItems; i++)
|
||||
{
|
||||
const CDirItem &fileInfo = *_refs[indices[i]];
|
||||
const UString fullPath = _path + GetRelPath(fileInfo);
|
||||
const CDirItem &fi = *_refs[indices[i]];
|
||||
const UString fullPath = _path + GetRelPath(fi);
|
||||
bool result;
|
||||
if (fileInfo.IsDir())
|
||||
if (fi.IsDir())
|
||||
result = NDirectory::RemoveDirectoryWithSubItems(fullPath);
|
||||
else
|
||||
result = NDirectory::DeleteFileAlways(fullPath);
|
||||
@@ -592,14 +607,14 @@ STDMETHODIMP CFSFolder::SetProperty(UInt32 index, PROPID propID,
|
||||
{
|
||||
if (index >= (UInt32)_refs.Size())
|
||||
return E_INVALIDARG;
|
||||
CDirItem &fileInfo = *_refs[index];
|
||||
if (fileInfo.Parent->Parent != 0)
|
||||
CDirItem &fi = *_refs[index];
|
||||
if (fi.Parent->Parent != 0)
|
||||
return E_NOTIMPL;
|
||||
switch(propID)
|
||||
{
|
||||
case kpidComment:
|
||||
{
|
||||
UString filename = fileInfo.Name;
|
||||
UString filename = fi.Name;
|
||||
filename.Trim();
|
||||
if (value->vt == VT_EMPTY)
|
||||
_comments.DeletePair(filename);
|
||||
@@ -630,10 +645,10 @@ STDMETHODIMP CFSFolder::GetSystemIconIndex(UInt32 index, Int32 *iconIndex)
|
||||
{
|
||||
if (index >= (UInt32)_refs.Size())
|
||||
return E_INVALIDARG;
|
||||
const CDirItem &fileInfo = *_refs[index];
|
||||
const CDirItem &fi = *_refs[index];
|
||||
*iconIndex = 0;
|
||||
int iconIndexTemp;
|
||||
if (GetRealIconIndex(_path + GetRelPath(fileInfo), fileInfo.Attrib, iconIndexTemp) != 0)
|
||||
if (GetRealIconIndex(_path + GetRelPath(fi), fi.Attrib, iconIndexTemp) != 0)
|
||||
{
|
||||
*iconIndex = iconIndexTemp;
|
||||
return S_OK;
|
||||
|
||||
Reference in New Issue
Block a user