Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.17;
Скачать: CL | DM;

Вниз

Синхронизация каталогов   Найти похожие ветки 

 
Kostafey ©   (2008-01-13 23:08) [0]

Есть 2 каталога. В них в целом сходная информация.
Как сделать так чтобы они стали идентичны?

Т.е. удаленные в одном каталоге файлы и
подкаталоги удалились, измененные обновились,
новые добавились.

В TotalCom есть Синхронизация каталогов,
но он только сравнивает, а не изменяет.

Special for Ketmar: os Windows :)


 
iZEN ©   (2008-01-13 23:18) [1]

meld


 
Kostafey ©   (2008-01-13 23:19) [2]

> [1] iZEN ©   (13.01.08 23:18)
> meld

А это что такое?
Чуть подробнее можно?


 
Ketmar ©   (2008-01-13 23:19) [3]

ну… софтину написать? %-)


 
Kostafey ©   (2008-01-13 23:20) [4]

> [3] Ketmar ©   (13.01.08 23:19)
> ну… софтину написать? %-)

Изобретать велосипед? :)


 
Kostafey ©   (2008-01-13 23:32) [5]


> [1] iZEN ©   (13.01.08 23:18)
> meld

Графический клиент CVS для Unix???
Очень смешно :)


 
antonn ©   (2008-01-13 23:34) [6]

у виндовоза вроде есть нечто, с названием "Портфель" :)


 
Ketmar ©   (2008-01-13 23:39) [7]

> Kostafey ©   (13.01.08 23:32) [5]
а чего ты от iZEN хотел? щаз он тебе пояснит, что лялих — отстой, и все должны стройными рядами идти на FreeBSD.

а велосипед, видимо, будет быстрее собрать, нежели найти готовый. мне так кажется.


 
Zeqfreed ©   (2008-01-13 23:44) [8]

rsync?


 
NailMan ©   (2008-01-14 00:39) [9]

по сетке синхронизирую 2 папки на двух компах с помощью SecondCopy2000

---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13


 
Джо ©   (2008-01-14 01:06) [10]

> [0] Kostafey ©   (13.01.08 23:08)
> Т.е. удаленные в одном каталоге файлы и
> подкаталоги удалились, измененные обновились,
> новые добавились.

А как разрулить — нужно ли удалять из одного каталога или, наоборот, добавлять в другой?


 
Kostafey ©   (2008-01-14 01:10) [11]

> [10] Джо ©   (14.01.08 01:06)
> А как разрулить — нужно ли удалять из одного каталога или,
> наоборот, добавлять в другой?

Да, нужно удалять.

Проще говоря, результат должен быть аналогичен тому как если бы
содержимое первой директории удалили и в нее (уже пустую) скопировали
содержимое второй.


 
Германн ©   (2008-01-14 01:19) [12]


> Kostafey ©   (14.01.08 01:10) [11]
>
> > [10] Джо ©   (14.01.08 01:06)
> > А как разрулить — нужно ли удалять из одного каталога
> или,
> > наоборот, добавлять в другой?
>
> Да, нужно удалять.
>
> Проще говоря, результат должен быть аналогичен тому как
> если бы
> содержимое первой директории удалили и в нее (уже пустую)
> скопировали
> содержимое второй.
>


А может быть наоборот? Вторую очистить и добавить в нее содержимое первой?
Ты так и не понял вопрос Джо ©   (14.01.08 01:06) [10]


 
Zeqfreed ©   (2008-01-14 01:21) [13]

> Джо ©   (14.01.08 01:06) [10]

Один каталог синхронизируется с другим. Одновременно они синхронизироваться не могут :) По крайней мере не должны.


 
Kostafey ©   (2008-01-14 01:24) [14]

> [12] Германн ©   (14.01.08 01:19)
> А может быть наоборот? Вторую очистить и добавить в нее
> содержимое первой?
> Ты так и не понял вопрос Джо ©   (14.01.08 01:06) [10]

В данном случае четко указывается, мол одна source, другая target.


 
Германн ©   (2008-01-14 01:31) [15]


> Kostafey ©   (14.01.08 01:24) [14]
>
> > [12] Германн ©   (14.01.08 01:19)
> > А может быть наоборот? Вторую очистить и добавить в нее
> > содержимое первой?
> > Ты так и не понял вопрос Джо ©   (14.01.08 01:06) [10]
>
> В данном случае четко указывается, мол одна source, другая
> target.
>

Ааа. А мы с Джр и не поняли сразу. Вот и Зигфрид к нам присуседился. :)


 
Германн ©   (2008-01-14 01:34) [16]


> Джо ©   (14.01.08 01:06) [10]

Вообще-то возможно универсальное решение. Вести третий каталог или файл, в которых содержится "образ" тех двух каталогов после последней синхронизации.


 
Zeqfreed ©   (2008-01-14 01:37) [17]

> Германн ©   (14.01.08 01:34) [16]

Опять же эта задача сводится к синхронизации одного каталога с другим. Только два раза :)


 
Германн ©   (2008-01-14 01:40) [18]


> Zeqfreed ©   (14.01.08 01:37) [17]
>
> > Германн ©   (14.01.08 01:34) [16]
>
> Опять же эта задача сводится к синхронизации одного каталога
> с другим. Только два раза :)
>

Зато универсально!
:)


 
Германн ©   (2008-01-14 01:43) [19]

Серёга, извини. Случайно промахнулся по клавише :(
Опять колено разболелось. Сижу под неудобным углом к столу :(


 
Джо ©   (2008-01-14 01:59) [20]

Задача теперь понятна, рецепт — [3] Ketmar  :)


> [19] Германн ©   (14.01.08 01:43)

Ниче, опечатки несущественны. Колено важнее :)


 
Kostafey ©   (2008-01-14 02:06) [21]

> [19] Германн ©   (14.01.08 01:43)
> Серёга, извини. Случайно промахнулся по клавише :(
> Опять колено разболелось. Сижу под неудобным углом к столу
> :(

Если это относится к

> [15] Германн ©   (14.01.08 01:31)

то похоже я жутко принорповился к опечаткам,
т.к. кодга первый раз читал ничего не заметил :)


 
Юрий Зотов ©   (2008-01-14 02:09) [22]

> Kostafey ©   (14.01.08 01:10) [11]

> результат должен быть аналогичен тому как если бы содержимое первой
> директории удалили и в нее (уже пустую) скопировали содержимое
> второй.

А тогда кто же мешает удалить содержимое первой директории, а в нее (уже пустую) скопировать содержимое второй?


 
Zeqfreed ©   (2008-01-14 02:14) [23]

> Юрий Зотов ©   (14.01.08 02:09) [22]

Если в обоих директориях лежал один фильм гигабайт на восемь, а потом в одну из них добавили текстовый файлик с описанием, то здравый смысл мешает.


 
Черный Шаман   (2008-01-14 02:16) [24]


> Kostafey ©   (13.01.08 23:08)
>
> Есть 2 каталога. В них в целом сходная информация.
> Как сделать так чтобы они стали идентичны?


http://tortoisesvn.net/


 
Kostafey ©   (2008-01-14 02:33) [25]

> [23] Zeqfreed ©   (14.01.08 02:14)
> > Юрий Зотов ©   (14.01.08 02:09) [22]
>
> Если в обоих директориях лежал один фильм гигабайт на восемь,
> а потом в одну из них добавили текстовый файлик с описанием,
> то здравый смысл мешает.

:) в точку.


> [24] Черный Шаман   (14.01.08 02:16)
>
> > Kostafey ©   (13.01.08 23:08)
> >
> > Есть 2 каталога. В них в целом сходная информация.
> > Как сделать так чтобы они стали идентичны?
>
>
> http://tortoisesvn.net/

при чем тут SVN, ничего попроще нет чтоль?

Вообще хорошее решение FolderClone,
еще лучше Beyond Compare 2.
Только они шареваре, а что-нибудь подобное
фриварное бывает?


 
Ketmar ©   (2008-01-14 02:45) [26]

13.01.08 23:08 — 14.01.08 02:33
софтина уже как минимум два часа назад должна быть готова.


 
Kostafey ©   (2008-01-14 02:55) [27]

> [26] Ketmar ©   (14.01.08 02:45)

Я сейчас другим занимаюсь.


 
Kostafey ©   (2008-01-14 02:56) [28]

в смысле другой совтиной :)


 
Германн ©   (2008-01-14 02:59) [29]


> Kostafey ©   (14.01.08 02:55) [27]
>
> > [26] Ketmar ©   (14.01.08 02:45)
>
> Я сейчас другим занимаюсь.
>

С учётом времени суток звучит очень скабрезно!
:) Тем более в общежитии!


 
Ketmar ©   (2008-01-14 03:21) [30]

на правах флэйма: блин. таки бедные, бедные виндузятники. ну, намекнуть тебе, что ли, что на свете есть cygwin и msys?


 
Kostafey ©   (2008-01-14 03:26) [31]

> [30] Ketmar ©   (14.01.08 03:21)
> на правах флэйма: блин. таки бедные, бедные виндузятники.
> ну, намекнуть тебе, что ли, что на свете есть cygwin и msys?

лень набирать просто, а так хотел начать
ругаться, мол да ф курсе я .....


 
Ketmar ©   (2008-01-14 03:34) [32]

ну так в чём дело, коли ф курсе? задача-то решается примитивным скриптом.


 
Slym ©   (2008-01-14 04:47) [33]

sync.vbs

Option Explicit
On Error Resume Next
If (Not WScript.Arguments.Named.Exists("src")) _
or (Not WScript.Arguments.Named.Exists("dst")) Then
 WScript.StdOut.WriteLine "Some parameter undefined"
 WScript.StdOut.WriteLine "Usage: cscript.exe " & WScript.ScriptName & " /src:Directory /dst:Directory [/log:filename]"
 WScript.Quit(1)
End If

Dim FSO, Src, Dst, Log
Set FSO = CreateObject("Scripting.FileSystemObject")

if WScript.Arguments.Named.Exists("log") then
 Set Log=FSO.OpenTextFile(WScript.Arguments.Named("log"),8,true)
else
 Set Log=WScript.StdOut
end if

Set Src = FSO.GetFolder(WScript.Arguments.Named("src"))

if FSO.FolderExists(WScript.Arguments.Named("dst")) then
 Set Dst = FSO.GetFolder(WScript.Arguments.Named("dst"))
else
 Set Dst = FSO.CreateFolder(WScript.Arguments.Named("dst"))
end if

SyncFolder Src, Dst
Log.Close

Sub SyncFolder(SrcFolder,DstFolder)
 Dim SrcFile, DstFile, DstFileName
 For Each SrcFile in SrcFolder.Files
   DstFileName=DstFolder.Path & "\" & SrcFile.Name
   if FSO.FileExists(DstFileName) then
     Set DstFile=FSO.GetFile(DstFileName)
     if (SrcFile.Size <> DstFile.Size) _
     or (Abs(SrcFile.DateLastModified - DstFile.DateLastModified)> 2/10000)then
       CopyFile SrcFile.Path,DstFileName
     else
       Log.WriteLine(SrcFile.Path & " - not modified")
     end if
   else
     CopyFile SrcFile.Path, DstFileName
   end if
 Next
 
 Dim SubFolder
 For Each SubFolder in SrcFolder.SubFolders
   DstFileName=DstFolder.Path & "\" & SubFolder.Name
   if FSO.FolderExists(DstFileName) then
     Set DstFile = FSO.GetFolder(DstFileName)
   else
     Set DstFile = FSO.CreateFolder(DstFileName)
   end if
   SyncFolder SubFolder, DstFile
 Next
End Sub

Sub CopyFile(SrcFileName,DstFileName)
 On Error Resume Next
 if FSO.FileExists(DstFileName) then
   FSO.DeleteFile(DstFileName)
 end if
 Err.number=0
 FSO.CopyFile SrcFileName, DstFileName, true
 If Err.number<>0 Then
   Log.WriteLine(SrcFileName & " - Ошибка " & Err.Number & ". " & Err.Description)
 else
   Log.WriteLine(SrcFileName & " - OK")
 end if
End Sub


 
Некто   (2008-01-14 09:05) [34]


> Slym ©   (14.01.08 04:47) [33]

Всё гораздо проще... xcopy.
Можно делать даже ещё проще.
ren destdir olddestdir
xcopy|copy srcdir destdir
а по результатам копирования уже судить, стоит ли делать del olddestdir или нет.

Удобно, когда объёмы небольшие, и оба каталога на NTFS носителях. Xcopy вместе с правами копирует.

Кстати, а зачем сравнивать размеры файлов?


 
Рамиль ©   (2008-01-14 09:10) [35]

Можно так

program ExCopy;

{$APPTYPE CONSOLE}

uses
 SysUtils, Classes, Windows;

type
 TSearchObj = class
 public
   SearchRec: TSearchRec;
 end;

var
 SourcePath, TargetPath: string;
 SourceList, TargetList: TStringList;
 i, idx: integer;

function FileTimeToDateTime(FT: _FILETIME): TDateTime;
var
 FileTime: _SYSTEMTIME;
begin
 FileTimeToLocalFileTime(FT, FT);
 FileTimeToSystemTime(FT, FileTime);
 Result := EncodeDate(FileTime.wYear, FileTime.wMonth, FileTime.wDay)+
   EncodeTime(FileTime.wHour, FileTime.wMinute, FileTime.wSecond, FileTime.wMilliseconds);
end;

function ExcludeBeginPath(BeginPath, Path: string): string;
begin
 Delete(Path, 1, length(BeginPath));
 Result := Path;
end;

procedure CreateFileList(var BeginPath: string; Path: string; var List: TstringList);
var
 SearchRec: TSearchRec;
 FindFlag: integer;
 SearchObj: TSearchObj;
begin
 FindFlag := FindFirst(Path + "*.*", faAnyFile, SearchRec);
 while FindFlag = 0 do
 begin
   if (SearchRec.Name <> ".") and (SearchRec.Name <> "..") then
   begin
     SearchObj := TSearchObj.Create;
     SearchObj.SearchRec := SearchRec;
     List.AddObject(ExcludeBeginPath(BeginPath, Path + SearchRec.Name), SearchObj);
     if (SearchRec.Attr and faDirectory <> 0) then
       CreateFileList(BeginPath, Path + SearchRec.Name + "\", List);
   end;
   FindFlag := FindNext(SearchRec);
 end;
 SysUtils.FindClose(SearchRec);
end;

begin
 SourcePath := ParamStr(1);
 TargetPath := ParamStr(2);
 if (SourcePath = "") or (TargetPath = "") or (length(TargetPath) < 4) then
 begin
   Writeln("Usage:");
   Writeln("ExCopy SourcePath TargetPath");
   Writeln("WARNING! All existing files and directories in TargetPath will be deleted (if it not present in SourceFolder)!");
   Writeln("To avoid crush your system TargetPath must be DIRECTORY!");
   exit;
 end;
 //Постороение списка файлов
 SourcePath := IncludeTrailingPathDelimiter(SourcePath);
 TargetPath := IncludeTrailingPathDelimiter(TargetPath);
 SourceList := TStringList.Create;
 TargetList := TStringList.Create;
 CreateFileList(SourcePath, SourcePath, SourceList);
 if DirectoryExists(TargetPath) then
   CreateFileList(TargetPath, TargetPath, TargetList)
 else
   CreateDir(TargetPath);
 SourceList.Sorted := true;
 TargetList.Sorted := true;
 //Копирование новых
 for i := 0 to SourceList.Count - 1 do
 begin
   if TargetList.Find(SourceList[i], idx) then
   begin
     if (TSearchObj(SourceList.Objects[i]).SearchRec.Attr and faDirectory = 0) and
        (FileTimeToDateTime(TSearchObj(SourceList.Objects[i]).SearchRec.FindData.ftLastW riteTime) >
         FileTimeToDateTime(TSearchObj(TargetList.Objects[idx]).SearchRec.FindData.ftLast WriteTime)) then
       begin
         CopyFile(PAnsiChar(SourcePath + SourceList[i]), PAnsiChar(TargetPath + SourceList[i]), false);
         Writeln("Copy: " + SourcePath + SourceList[i]);
       end
   end else
   begin
     if TSearchObj(SourceList.Objects[i]).SearchRec.Attr and faDirectory <> 0 then
       CreateDir(TargetPath + SourceList[i])
     else
       begin
        CopyFile(PAnsiChar(SourcePath + SourceList[i]), PAnsiChar(TargetPath + SourceList[i]), false);
        Writeln("Copy: " + SourcePath + SourceList[i]);
       end;
   end;
 end;
 //Удаление отсутствующих
 for i := TargetList.Count - 1 downto 0 do
 begin
   if not SourceList.Find(TargetList[i], idx) then
   begin
     if TSearchObj(TargetList.Objects[i]).SearchRec.Attr and faDirectory <> 0 then
       RemoveDir(TargetPath + TargetList[i])
     else
     begin
       if (TsearchObj(TargetList.Objects[i]).SearchRec.Attr and (faReadOnly or faHidden) <> 0) then
         FileSetAttr(TargetPath + TargetList[i], TsearchObj(TargetList.Objects[i]).SearchRec.Attr and not (faReadOnly or faHidden));
       DeleteFile(PAnsiChar(TargetPath + TargetList[i]));
       Writeln("Delete: " + TargetPath + TargetList[i]);
     end;
   end;
 end;
 SourceList.Free;
 TargetList.Free;
end.


 
Рамиль ©   (2008-01-14 09:13) [36]

Права не сохранятся, правда.


 
Некто   (2008-01-14 09:23) [37]


> Slym ©   (14.01.08 04:47) [33]


> Abs(SrcFile.DateLastModified - DstFile.DateLastModified)>
> 2/10000


Ух... а я до такого не додумался. Пришлось писать скрипт, который пробегается рекурсивно по каталогу-источнику. Запихивает полный путь и дату изменения в таблицу БД и копирует каталог-источник в каталог-приёмник. В последующие разы опять пробегает рекурсивно по каталогу-источнику и проделывает то же самое. Потом сравнивает старую таблицу и новую и по несоответствиям синхронизирует источник с приёмником. Кажется громоздко, но работает очень быстро, т.к. сравнение производит СУБД. Мне приходится синхронизировать NTFS-диск объёмом 100 ГБ с сетевым хранилищем, которое поддерживает только FAT32 и, к тому же, довольно тормозное. Простое копирование 100 гигов на него занимает порядка нескольких суток.


 
Slym ©   (2008-01-14 10:02) [38]

Некто   (14.01.08 9:23) [37]
2/10000

известная проблема 2секундной  потери точности в FAT32/16
практически все известные мне программы "синхронизаторы" имеют опцию аля TwoSecondsPrecision ON/OFF


 
Slym ©   (2008-01-14 10:13) [39]

Некто   (14.01.08 9:05) [34]
Всё гораздо проще... xcopy

под XP есть еще robocopy.exe, но какойто kit ставить надо или из инета качать


 
Nekto ©   (2008-01-14 10:30) [40]


> известная проблема 2секундной  потери точности в FAT32/16

А я думал, что потеря идёт от балды в диапазоне от -2 до +2 секунд. Мне тогда лень было занимать этим вопросом и я сделал иначе и результат меня порадовал. :)


 
TUser ©   (2008-01-14 11:15) [41]

FAR -> Alt+F11 -> Advanced compare -> F5


 
Skyle ©   (2008-01-14 11:31) [42]


> TUser ©   (14.01.08 11:15) [41]
> FAR -> Alt+F11 -> Advanced compare -> F5

Просто F11


 
_xxx_   (2008-01-14 12:41) [43]

antonn ©   (13.01.08 23:34) [6]
+1


 
Игорь Шевченко ©   (2008-01-14 12:45) [44]

ну не знаю, я свою писал. Оно правда по времени не сравнивало, сравнивало по CRC, и существовала опция "приоритетного каталога"


 
iZEN ©   (2008-01-14 13:27) [45]


> Kostafey ©   (13.01.08 23:19) [2]
>
> > [1] iZEN ©   (13.01.08 23:18)
> > meld
>
> А это что такое?
> Чуть подробнее можно?
>


Meld is a GNOME 2 visual diff and merge tool. It integrates especially well
with CVS. The diff viewer lets you edit files in place (diffs update
dynamically), and a middle column shows detailed changes and allows merges.
The margins show location of changes for easy navigation, and it also
features a tabbed interface that allows you to open many diffs at once.

WWW: http://meld.sourceforge.net/


 
Игорь Шевченко ©   (2008-01-14 13:36) [46]


> visual diff and merge tool


Это все конечно хорошо, но когда надо каталоги слить, зачем нужно что-то visual ?


 
Ketmar ©   (2008-01-14 14:30) [47]

Удалено модератором
Примечание: Правила читаем и уважаем


 
Slym ©   (2008-01-15 04:44) [48]

Игорь Шевченко ©   (14.01.08 12:45) [44]
сравнивало по CRC

а когда конечный каталог - тормозное устройство для которого считать CRC смерти подобно? и есть лимит времени/процессора/сети
остается только отодвинуть 100% гарантию CRC (100 -ничтожный% вероятности) в сторону вероятности несовпадения размера/даты файлов


 
ketmar ©   (2008-01-15 06:28) [49]

сходил по ссылке из [45]. не понял, а где там java? не тот iZEN уже, не тот. стареет…


 
Kostafey ©   (2008-01-15 10:39) [50]

> [45] iZEN ©   (14.01.08 13:27)


> It integrates especially well
> with CVS.

Гы-гы-гы а сами для разработки Meld svn юзали :)

Все же не понимаю оно для Unix, его что и для Win можно
скомпилировать?


> [49] ketmar ©   (15.01.08 06:28)
> сходил по ссылке из [45]. не понял, а где там java? не тот
> iZEN уже, не тот. стареет…

А что кто-то про Java говорил ???


 
Игорь Шевченко ©   (2008-01-15 10:52) [51]

Slym ©   (15.01.08 04:44) [48]

Тогда не сравнивать каталоги, один из которых на тормозном устройстве, неужели неясно ? :)


 
Kostafey ©   (2008-01-15 12:50) [52]

Ну из всего что я просмотрел для Win, пожалуй лучшее решение
Beyond Compare (кряки еще не отменили).

Еще есть хорошая консольна фришная утилита отечественной
(по всей видимости) разработки nnbackup.


 
Некто   (2008-01-15 13:09) [53]


> Kostafey ©   (15.01.08 12:50) [52]


> nnbackup


Да, помню, хорошая тулза, но имела ошибки. из-за них приходилось пользоваться бета-версиями с исправленными ошибками.


 
Jeer ©   (2008-01-15 13:42) [54]

ZSKSoft Synchronizer (ZSync2)


 
nekto ©   (2008-01-15 15:01) [55]

Можно DFS для этого использовать ещё. Там есть репликация ресурсов.
А ещё практически любой архиватор. :)


 
ketmar ©   (2008-01-15 16:40) [56]

>[50] Kostafey©(15.01.08 10:39)
>А что кто-то про Java говорил ???

а это ты или [47] не успел прочитать, или iZEN"а редко видел, или и то, и другое. «старички» шутку поймут.


 
Kostafey ©   (2008-01-15 16:52) [57]

> [56] ketmar ©   (15.01.08 16:40)
> а это ты или [47] не успел прочитать, или iZEN"а редко видел,
> или и то, и другое. «старички» шутку поймут.

И то и другое :)



Страницы: 1 2 вся ветка

Текущий архив: 2008.02.17;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.045 c
15-1200181039
KilkennyCat
2008-01-13 02:37
2008.02.17
Доколе?


2-1201085745
Mariya
2008-01-23 13:55
2008.02.17
WorkBook.WorkSheets[1].Cells[1,1]:=tbmain.FieldValues[ Zvanie ];


2-1201253023
Lexa11_2002
2008-01-25 12:23
2008.02.17
TCheckListBox


15-1200227591
Lip
2008-01-13 15:33
2008.02.17
Как проверить введенное число в С


2-1201085924
Rusl92
2008-01-23 13:58
2008.02.17
Печать таблицы из Бд