View Issue Details

IDProjectCategoryView StatusLast Update
0001848Double CommanderDefaultpublic2017-12-23 16:12
Reportercordylus Assigned To 
PrioritynormalSeverityminorReproducibilityalways
Status newResolutionopen 
ProjectionnoneETAnone 
Product Version0.7.8 
Summary0001848: Can't compare two archives using directory synchronization tool
DescriptionSays "Function not supported!"
TagsNo 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;
 
 //------------------------------------------------------
umaincommands.pas.patch (822 bytes)   
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;
 
bug1848-preview1.patch (3,003 bytes)   
Fixed in Revision
Operating system
Widgetset
Architecture

Activities

cordylus

2017-05-24 11:41

developer   ~0002251

Функционально программа сравнивает архивы без проблем, только не умеет синхронизировать. Патч откатывает изменения ревизии 5535, запрещающие открытие инструмента, сама синхронизация по-прежнему остается заблокированной. Альтерантивно можно заменить msgWarning на MessageDlg с возможностью его проигнорировать, по типу TfrmDiffer.ShowIdentical. Третий вариант - реализовать недостающую синхронизацию архивов. Для этого, насколько я понял, достаточно использовать TfrmMain.CopyFiles вместо собственной подпроцедуры CopyFiles. Зачем нужна своя - я не понял, я что-то упускаю?

Alexx2000

2017-05-24 22:29

administrator   ~0002252

Функция TfrmMain.CopyFiles не подходит. Она выполняет полное рекурсивное копирование дерева каталогов. В то время как CopyFiles выполняет выборочное копирование файлов отдельно для каждого каталога.

cordylus

2017-05-26 13:27

developer   ~0002257

Если я правильно понял разницу, то при передаче файлов из поддиректорий (flat view, результаты поиска) в функцию обычного копирования, они все будут сложены в один каталог, а в случае функции для синхронизации каталогов воссоздастся структура подпапок. В связи с этим возникла идея доработать функцию обычного копирования, добавив в нее возможность воссоздания структуры каталогов. Помимо унифицирования функций копирования, это может оказаться весьма полезной опцией при копировании из flat view или результатов поиска (у поиска тоже есть стартовая директория, от которой можно рассчитывать относительный путь).

cordylus

2017-12-23 16:10

developer   ~0002469

Last edited: 2017-12-23 16:12

В 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, по аналогии с архивами?) или вместо этого просто создать по операции создания каталога и копирования файлов для каждого каталога в случаях, когда ожидается прямое копирование, и сложить их все в одну большую очередь?

Issue History

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