View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001848 | Double Commander | Default | public | 2017-05-24 11:28 | 2017-12-23 16:12 |
Reporter | cordylus | Assigned To | |||
Priority | normal | Severity | minor | Reproducibility | always |
Status | new | Resolution | open | ||
Projection | none | ETA | none | ||
Product Version | 0.7.8 | ||||
Summary | 0001848: Can't compare two archives using directory synchronization tool | ||||
Description | Says "Function not supported!" | ||||
Tags | No tags attached. | ||||
Attached Files | umaincommands.pas.patch (822 bytes)
Index: src/umaincommands.pas =================================================================== --- src/umaincommands.pas (revision 7570) +++ src/umaincommands.pas (working copy) @@ -3159,20 +3159,8 @@ end; procedure TMainCommands.cm_SyncDirs(const Params: array of string); -var - OperationType: TFileSourceOperationType; begin - with frmMain do - begin - if GetCopyOperationType(FrameLeft.FileSource, FrameRight.FileSource, OperationType) or - GetCopyOperationType(FrameRight.FileSource, FrameLeft.FileSource, OperationType) then - begin - ShowSyncDirsDlg(FrameLeft, FrameRight); - end - else begin - msgWarning(rsMsgErrNotSupported); - end; - end; + ShowSyncDirsDlg(frmMain.FrameLeft, frmMain.FrameRight); end; //------------------------------------------------------ bug1848-preview1.patch (3,003 bytes)
Index: src/fsyncdirsdlg.pas =================================================================== --- src/fsyncdirsdlg.pas (revision 7936) +++ src/fsyncdirsdlg.pas (working copy) @@ -494,15 +494,15 @@ try edLeftPath.Text := FCmpFileSourceL.CurrentAddress + FCmpFilePathL; edRightPath.Text := FCmpFileSourceR.CurrentAddress + FCmpFilePathR; - if (CopyLeftCount > 0) and - GetCopyOperationType(FFileSourceR, FFileSourceL, OperationType) then + if (CopyLeftCount > 0) {and + GetCopyOperationType(FFileSourceR, FFileSourceL, OperationType)} then begin chkRightToLeft.Enabled := True; chkRightToLeft.Checked := True; edLeftPath.Enabled := True; end; - if (CopyRightCount > 0) and - GetCopyOperationType(FFileSourceL, FFileSourceR, OperationType) then + if (CopyRightCount > 0) {and + GetCopyOperationType(FFileSourceL, FFileSourceR, OperationType)} then begin chkLeftToRight.Enabled := True; chkLeftToRight.Checked := True; @@ -525,12 +525,17 @@ CopyLeft := chkRightToLeft.Checked; CopyRight := chkLeftToRight.Checked; DeleteRight := chkDeleteRight.Checked; + CopyLeftFiles := TFiles.Create(FCmpFilePathR); // TODO: free these + CopyRightFiles := TFiles.Create(FCmpFilePathL); + DeleteRightFiles := TFiles.Create(FCmpFilePathR); i := 0; while i < FVisibleItems.Count do begin +{ CopyLeftFiles := TFiles.Create(''); CopyRightFiles := TFiles.Create(''); DeleteRightFiles := TFiles.Create(''); +} if FVisibleItems.Objects[i] <> nil then repeat fsr := TFileSyncRec(FVisibleItems.Objects[i]); @@ -546,6 +551,7 @@ i := i + 1; until (i = FVisibleItems.Count) or (FVisibleItems.Objects[i] = nil); i := i + 1; +{ if CopyLeftFiles.Count > 0 then begin if not CopyFiles(FCmpFileSourceR, FCmpFileSourceL, CopyLeftFiles, @@ -561,8 +567,13 @@ if not DeleteFiles(FCmpFileSourceR, DeleteRightFiles) then Break; end else DeleteRightFiles.Free; +} end; + frmMain.CopyFiles(FCmpFileSourceR, FCmpFileSourceL, CopyLeftFiles, FCmpFilePathL, False); + frmMain.CopyFiles(FCmpFileSourceL, FCmpFileSourceR, CopyRightFiles, FCmpFilePathR, False); +{ btnCompare.Click; +} end; finally Free Index: src/umaincommands.pas =================================================================== --- src/umaincommands.pas (revision 7936) +++ src/umaincommands.pas (working copy) @@ -3072,14 +3072,18 @@ begin with frmMain do begin +{ if GetCopyOperationType(FrameLeft.FileSource, FrameRight.FileSource, OperationType) or GetCopyOperationType(FrameRight.FileSource, FrameLeft.FileSource, OperationType) then begin +} ShowSyncDirsDlg(FrameLeft, FrameRight); +{ end else begin msgWarning(rsMsgErrNotSupported); end; +} end; end; | ||||
Fixed in Revision | |||||
Operating system | |||||
Widgetset | |||||
Architecture | |||||
|
Функционально программа сравнивает архивы без проблем, только не умеет синхронизировать. Патч откатывает изменения ревизии 5535, запрещающие открытие инструмента, сама синхронизация по-прежнему остается заблокированной. Альтерантивно можно заменить msgWarning на MessageDlg с возможностью его проигнорировать, по типу TfrmDiffer.ShowIdentical. Третий вариант - реализовать недостающую синхронизацию архивов. Для этого, насколько я понял, достаточно использовать TfrmMain.CopyFiles вместо собственной подпроцедуры CopyFiles. Зачем нужна своя - я не понял, я что-то упускаю? |
|
Функция TfrmMain.CopyFiles не подходит. Она выполняет полное рекурсивное копирование дерева каталогов. В то время как CopyFiles выполняет выборочное копирование файлов отдельно для каждого каталога. |
|
Если я правильно понял разницу, то при передаче файлов из поддиректорий (flat view, результаты поиска) в функцию обычного копирования, они все будут сложены в один каталог, а в случае функции для синхронизации каталогов воссоздастся структура подпапок. В связи с этим возникла идея доработать функцию обычного копирования, добавив в нее возможность воссоздания структуры каталогов. Помимо унифицирования функций копирования, это может оказаться весьма полезной опцией при копировании из flat view или результатов поиска (у поиска тоже есть стартовая директория, от которой можно рассчитывать относительный путь). |
|
В TfrmMain.CopyFiles и не нужно передавать каталоги, а только файлы. Прикладываю патч посмотреть, что из этого получается. А получается вот что: упаковщики и распаковщики архивов (CopyIn и CopyOut) прекрасно понимают, как работать с относительными путями (от TFiles.Path) и сами воссоздают всю структуру папок (если только не включен TFiles.Flat, а по умолчанию при создании TFiles - не включен), в итоге синхронизация между архивом и фс и даже между двумя архивами проходит бесшовно, не потребовалось даже изменений в TfrmMain.CopyFiles. Однако проблема возникает с самым обычным Copy. Этот вариант (входные файлы не из одной директории и выходные файлы не только в целевой директории), похоже, просто не проработан, поскольку никогда не происходит при обычном использовании? Обычно ведь максимум Flat view, т.е. только разные каталоги входных файлов, а в WFX и того нет. С TWcxArchiveFileSource все прекрасно, работает в обе стороны с фс и друг с другом. Проверял на zip. С обычным TFileSystemFileSource все файлы складываются в одну директорию, как если бы структуры и не было. Насколько я понял, в данном случае проблема сводится к TFileSourceTreeBuilder.BuildFromFiles, ибо TFileSystemOperationHelper.ProcessNode получает уже плоский список. С TWfxPluginFileSource работает нормально только если структура каталогов предварительно создана, иначе выдает ошибку, что якобы не может прочитать файл, и ломает соединение (DSOCK ERROR Connection refused до переподключаения). Проверял на плагине FTP с ftpdmin.exe. Тут еще глубоко не вникал, но предположительно сводится либо к TWfxPluginOperationHelper.ProcessFiles, либо к TWfxPluginFileSource.FillAndCount Как проверить TMultiArchiveFileSource? Если я ничего не упустил, то все остальные источники наследуются от перечисленных систем без перереализации копирования. P.S. Патч сырой, без удаления файлов (при асинхронном сравнении), без поддержки опции ask for overwrite, без создания очереди, без удаления старого кода. Он больше как демонстрация возможности и основа для дальнейшего развития. И стоит ли вообще пытаться всё это починить (добавить проверку на Flat, по аналогии с архивами?) или вместо этого просто создать по операции создания каталога и копирования файлов для каждого каталога в случаях, когда ожидается прямое копирование, и сложить их все в одну большую очередь? |
Date Modified | Username | Field | Change |
---|---|---|---|
2017-05-24 11:28 | cordylus | New Issue | |
2017-05-24 11:28 | cordylus | File Added: umaincommands.pas.patch | |
2017-05-24 11:41 | cordylus | Note Added: 0002251 | |
2017-05-24 22:29 | Alexx2000 | Note Added: 0002252 | |
2017-05-26 13:27 | cordylus | Note Added: 0002257 | |
2017-12-23 16:09 | cordylus | File Added: bug1848-preview1.patch | |
2017-12-23 16:10 | cordylus | Note Added: 0002469 | |
2017-12-23 16:12 | cordylus | Note Edited: 0002469 |