feat: do not set time for sole folder in extraction

This commit is contained in:
shunf4
2024-05-10 15:52:53 +08:00
parent fabeab4a9f
commit 76db359120
9 changed files with 40 additions and 6 deletions

View File

@@ -1457,6 +1457,7 @@ Z7_COM7F_IMF(CAgentFolder::Extract(const UInt32 *indices,
UInt32 numItems, UInt32 numItems,
Int32 includeAltStreams, Int32 includeAltStreams,
Int32 replaceAltStreamColon, Int32 replaceAltStreamColon,
Int64 soleFolderIndex,
NExtract::NPathMode::EEnum pathMode, NExtract::NPathMode::EEnum pathMode,
NExtract::NOverwriteMode::EEnum overwriteMode, NExtract::NOverwriteMode::EEnum overwriteMode,
const wchar_t *path, const wchar_t *path,
@@ -1535,6 +1536,8 @@ Z7_COM7F_IMF(CAgentFolder::Extract(const UInt32 *indices,
// do we need another base folder for subfolders ? // do we need another base folder for subfolders ?
extractCallbackSpec->DirPathPrefix_for_HashFiles = _agentSpec->_hashBaseFolderPrefix; extractCallbackSpec->DirPathPrefix_for_HashFiles = _agentSpec->_hashBaseFolderPrefix;
extractCallbackSpec->SoleFolderIndex = soleFolderIndex;
CUIntVector realIndices; CUIntVector realIndices;
GetRealIndices(indices, numItems, IntToBool(includeAltStreams), GetRealIndices(indices, numItems, IntToBool(includeAltStreams),
false, // includeFolderSubItemsInFlatMode false, // includeFolderSubItemsInFlatMode

View File

@@ -24,7 +24,7 @@ Z7_COM7F_IMF(CAgentFolder::SetZoneIdMode(NExtract::NZoneIdMode::EEnum zoneMode))
Z7_COM7F_IMF(CAgentFolder::CopyTo(Int32 moveMode, const UInt32 *indices, UInt32 numItems, Z7_COM7F_IMF(CAgentFolder::CopyTo(Int32 moveMode, const UInt32 *indices, UInt32 numItems,
Int32 includeAltStreams, Int32 replaceAltStreamCharsMode, Int32 includeAltStreams, Int32 replaceAltStreamCharsMode, Int64 soleFolderIndex,
const wchar_t *path, IFolderOperationsExtractCallback *callback)) const wchar_t *path, IFolderOperationsExtractCallback *callback))
{ {
if (moveMode) if (moveMode)
@@ -45,6 +45,7 @@ Z7_COM7F_IMF(CAgentFolder::CopyTo(Int32 moveMode, const UInt32 *indices, UInt32
return Extract(indices, numItems, return Extract(indices, numItems,
includeAltStreams, replaceAltStreamCharsMode, includeAltStreams, replaceAltStreamCharsMode,
soleFolderIndex,
pathMode, NExtract::NOverwriteMode::kAsk, pathMode, NExtract::NOverwriteMode::kAsk,
path, BoolToInt(false), extractCallback2); path, BoolToInt(false), extractCallback2);
COM_TRY_END COM_TRY_END

View File

@@ -27,6 +27,7 @@ IArchiveFolder is used by:
x(Extract(const UInt32 *indices, UInt32 numItems, \ x(Extract(const UInt32 *indices, UInt32 numItems, \
Int32 includeAltStreams, \ Int32 includeAltStreams, \
Int32 replaceAltStreamCharsMode, \ Int32 replaceAltStreamCharsMode, \
Int64 soleFolderIndex, \
NExtract::NPathMode::EEnum pathMode, \ NExtract::NPathMode::EEnum pathMode, \
NExtract::NOverwriteMode::EEnum overwriteMode, \ NExtract::NOverwriteMode::EEnum overwriteMode, \
const wchar_t *path, Int32 testMode, \ const wchar_t *path, Int32 testMode, \

View File

@@ -275,7 +275,8 @@ CArchiveExtractCallback::CArchiveExtractCallback():
Write_CTime(true), Write_CTime(true),
Write_ATime(true), Write_ATime(true),
Write_MTime(true), Write_MTime(true),
_multiArchives(false) _multiArchives(false),
SoleFolderIndex(-1LL)
{ {
LocalProgressSpec = new CLocalProgress(); LocalProgressSpec = new CLocalProgress();
_localProgress = LocalProgressSpec; _localProgress = LocalProgressSpec;
@@ -378,6 +379,8 @@ void CArchiveExtractCallback::Init(
NDir::MyGetFullPathName(directoryPath, _dirPathPrefix_Full); NDir::MyGetFullPathName(directoryPath, _dirPathPrefix_Full);
NName::NormalizeDirPathPrefix(_dirPathPrefix_Full); NName::NormalizeDirPathPrefix(_dirPathPrefix_Full);
} }
SoleFolderIndex = -1LL;
} }
@@ -1142,7 +1145,7 @@ void CArchiveExtractCallback::CreateFolders()
CDirPathTime pt; CDirPathTime pt;
GetFiTimesCAM(pt); GetFiTimesCAM(pt);
if (pt.IsSomeTimeDefined()) if (pt.IsSomeTimeDefined() && _index != SoleFolderIndex)
{ {
pt.Path = fullPathNew; pt.Path = fullPathNew;
pt.SetDirTime(); pt.SetDirTime();

View File

@@ -455,6 +455,7 @@ public:
#endif #endif
_keepAndReplaceEmptyDirPrefixes = keepAndReplaceEmptyDirPrefixes; _keepAndReplaceEmptyDirPrefixes = keepAndReplaceEmptyDirPrefixes;
NumFolders = NumFiles = NumAltStreams = UnpackSize = AltStreams_UnpackSize = 0; NumFolders = NumFiles = NumAltStreams = UnpackSize = AltStreams_UnpackSize = 0;
SoleFolderIndex = -1LL;
} }
#ifndef Z7_SFX #ifndef Z7_SFX

View File

@@ -496,7 +496,7 @@ static void AddPropValueToSum(IFolderFolder *folder, UInt32 index, PROPID propID
sum = (UInt64)(Int64)-1; sum = (UInt64)(Int64)-1;
} }
UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices, int *soleDir) UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices, int *soleDir, Int64 &soleFolderIndex)
{ {
UString info; UString info;
UInt64 numDirs, numFiles, filesSize, foldersSize; UInt64 numDirs, numFiles, filesSize, foldersSize;
@@ -511,6 +511,7 @@ UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices, int *so
{ {
if (i == 0) { if (i == 0) {
*soleDir = 1; *soleDir = 1;
soleFolderIndex = (Int64)index;
} else { } else {
*soleDir = 0; *soleDir = 0;
} }
@@ -525,6 +526,10 @@ UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices, int *so
} }
} }
if ((*soleDir) != 1) {
soleFolderIndex = -1LL;
}
AddValuePair2(info, IDS_PROP_FOLDERS, numDirs, foldersSize); AddValuePair2(info, IDS_PROP_FOLDERS, numDirs, foldersSize);
AddValuePair2(info, IDS_PROP_FILES, numFiles, filesSize); AddValuePair2(info, IDS_PROP_FILES, numFiles, filesSize);
int numDefined = ((foldersSize != (UInt64)(Int64)-1) && foldersSize != 0) ? 1: 0; int numDefined = ((foldersSize != (UInt64)(Int64)-1) && foldersSize != 0) ? 1: 0;
@@ -629,6 +634,8 @@ void CApp::OnCopy(bool move, bool copyToSame, unsigned srcPanelIndex)
const bool useFullItemPaths = srcPanel.Is_IO_FS_Folder(); // maybe we need flat also here ?? const bool useFullItemPaths = srcPanel.Is_IO_FS_Folder(); // maybe we need flat also here ??
Int64 soleFolderIndex = -1LL; // initially unset value
{ {
CCopyDialog copyDialog; CCopyDialog copyDialog;
@@ -636,7 +643,7 @@ void CApp::OnCopy(bool move, bool copyToSame, unsigned srcPanelIndex)
copyDialog.Value = destPath; copyDialog.Value = destPath;
LangString(move ? IDS_MOVE : IDS_COPY, copyDialog.Title); LangString(move ? IDS_MOVE : IDS_COPY, copyDialog.Title);
LangString(move ? IDS_MOVE_TO : IDS_COPY_TO, copyDialog.Static); LangString(move ? IDS_MOVE_TO : IDS_COPY_TO, copyDialog.Static);
copyDialog.Info = srcPanel.GetItemsInfoString(indices, &copyDialog.soleDir); copyDialog.Info = srcPanel.GetItemsInfoString(indices, &copyDialog.soleDir, soleFolderIndex);
copyDialog.m_currentFolderPrefix = srcPanel._currentFolderPrefix; copyDialog.m_currentFolderPrefix = srcPanel._currentFolderPrefix;
if (copyDialog.Create(srcPanel.GetParent()) != IDOK) if (copyDialog.Create(srcPanel.GetParent()) != IDOK)
@@ -815,6 +822,7 @@ void CApp::OnCopy(bool move, bool copyToSame, unsigned srcPanelIndex)
options.includeAltStreams = true; options.includeAltStreams = true;
options.replaceAltStreamChars = false; options.replaceAltStreamChars = false;
options.showErrorMessages = true; options.showErrorMessages = true;
options.soleFolderIndex = soleFolderIndex;
result = srcPanel.CopyTo(options, indices, NULL); result = srcPanel.CopyTo(options, indices, NULL);
} }

View File

@@ -265,6 +265,7 @@ struct CCopyToOptions
NExtract::NZoneIdMode::EEnum ZoneIdMode; NExtract::NZoneIdMode::EEnum ZoneIdMode;
UString folder; UString folder;
Int64 soleFolderIndex;
UStringVector hashMethods; UStringVector hashMethods;
@@ -280,6 +281,7 @@ struct CCopyToOptions
showErrorMessages(false), showErrorMessages(false),
NeedRegistryZone(true), NeedRegistryZone(true),
ZoneIdMode(NExtract::NZoneIdMode::kNone), ZoneIdMode(NExtract::NZoneIdMode::kNone),
soleFolderIndex(-1LL),
VirtFileSystemSpec(NULL), VirtFileSystemSpec(NULL),
VirtFileSystem(NULL) VirtFileSystem(NULL)
{} {}
@@ -971,7 +973,7 @@ public:
void RefreshTitle(bool always = false) { _panelCallback->RefreshTitle(always); } void RefreshTitle(bool always = false) { _panelCallback->RefreshTitle(always); }
void RefreshTitleAlways() { RefreshTitle(true); } void RefreshTitleAlways() { RefreshTitle(true); }
UString GetItemsInfoString(const CRecordVector<UInt32> &indices, int *soleDir); UString GetItemsInfoString(const CRecordVector<UInt32> &indices, int *soleDir, Int64 &soleFolderIndex);
}; };
class CMyBuffer class CMyBuffer

View File

@@ -114,6 +114,7 @@ HRESULT CPanelCopyThread::ProcessVirt()
&Indices.Front(), Indices.Size(), &Indices.Front(), Indices.Size(),
BoolToInt(options->includeAltStreams), BoolToInt(options->includeAltStreams),
BoolToInt(options->replaceAltStreamChars), BoolToInt(options->replaceAltStreamChars),
options->soleFolderIndex,
options->folder, ExtractCallback); options->folder, ExtractCallback);
if (result2 == S_OK && !ExtractCallbackSpec->ThereAreMessageErrors) if (result2 == S_OK && !ExtractCallbackSpec->ThereAreMessageErrors)

View File

@@ -554,6 +554,7 @@ public:
CRecordVector<UInt32> Indices; CRecordVector<UInt32> Indices;
UString SrcDirPrefix_Temp; // FS directory with source files or Temp UString SrcDirPrefix_Temp; // FS directory with source files or Temp
Int64 SoleFolderIndex;
UString DestDirPrefix_FromTarget; UString DestDirPrefix_FromTarget;
/* destination Path that was sent by Target via SetData(). /* destination Path that was sent by Target via SetData().
it can be altstreams prefix. it can be altstreams prefix.
@@ -633,6 +634,7 @@ void CDataObject::CopyFromPanelTo_Folder()
{ {
CCopyToOptions options; CCopyToOptions options;
options.folder = SrcDirPrefix_Temp; options.folder = SrcDirPrefix_Temp;
options.soleFolderIndex = SoleFolderIndex;
/* 15.13: fixed problem with mouse cursor for password window. /* 15.13: fixed problem with mouse cursor for password window.
DoDragDrop() probably calls SetCapture() to some hidden window. DoDragDrop() probably calls SetCapture() to some hidden window.
But it's problem, if we show some modal window, like MessageBox. But it's problem, if we show some modal window, like MessageBox.
@@ -1579,6 +1581,7 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */, bool isRightButton)
*/ */
} }
Int64 soleFolderIndex = -1LL; // initially unset value
{ {
UStringVector names; UStringVector names;
// names variable is USED for drag and drop from 7-zip to Explorer or to 7-zip archive folder. // names variable is USED for drag and drop from 7-zip to Explorer or to 7-zip archive folder.
@@ -1592,6 +1595,15 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */, bool isRightButton)
else else
{ {
s = GetItemName(index); s = GetItemName(index);
if (IsItem_Folder(index)) {
if (i == 0) {
soleFolderIndex = (Int64)index;
} else {
soleFolderIndex = -1LL;
}
} else {
soleFolderIndex = -1LL;
}
/* /*
// We use (keepAndReplaceEmptyPrefixes = true) in CAgentFolder::Extract // We use (keepAndReplaceEmptyPrefixes = true) in CAgentFolder::Extract
// So the following code is not required. // So the following code is not required.
@@ -1620,6 +1632,7 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */, bool isRightButton)
dataObjectSpec->Panel = this; dataObjectSpec->Panel = this;
dataObjectSpec->Indices = indices; dataObjectSpec->Indices = indices;
dataObjectSpec->SrcDirPrefix_Temp = dirPrefix; dataObjectSpec->SrcDirPrefix_Temp = dirPrefix;
dataObjectSpec->SoleFolderIndex = soleFolderIndex;
dropSourceSpec->DataObjectSpec = dataObjectSpec; dropSourceSpec->DataObjectSpec = dataObjectSpec;
dropSourceSpec->DataObject = dataObjectSpec; dropSourceSpec->DataObject = dataObjectSpec;
@@ -1757,6 +1770,7 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */, bool isRightButton)
*/ */
// options.moveMode = (moveIsAllowed && effect == DROPEFFECT_MOVE) // before v23.00: // options.moveMode = (moveIsAllowed && effect == DROPEFFECT_MOVE) // before v23.00:
options.moveMode = moveIsAllowed; options.moveMode = moveIsAllowed;
options.soleFolderIndex = soleFolderIndex;
if (moveIsAllowed) if (moveIsAllowed)
{ {
if (dataObjectSpec->m_Transfer_WasSet) if (dataObjectSpec->m_Transfer_WasSet)