Главная страница
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 секунд. Мне тогда лень было занимать этим вопросом и я сделал иначе и результат меня порадовал. :)



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

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

Наверх




Память: 0.58 MB
Время: 0.02 c
2-1201293185
Riply
2008-01-25 23:33
2008.02.17
ReopenFile - как бы пооптимальнее выкрутиться ?


2-1201095078
ply
2008-01-23 16:31
2008.02.17
работа с закладками


6-1180089084
inex
2007-05-25 14:31
2008.02.17
ftp прокси


4-1183827804
newones
2007-07-07 21:03
2008.02.17
Диалог выбора и создания папки


2-1201003051
deras
2008-01-22 14:57
2008.02.17
Первый и последний дни месяца.