Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.039 c
15-1200392916
Ega23
2008-01-15 13:28
2008.02.17
Service средствами Delphi : возможено ли?


2-1201260171
Леонид
2008-01-25 14:22
2008.02.17
Как блокировать сообщение об ошибке


2-1201174029
Тоник
2008-01-24 14:27
2008.02.17
listbox с картинками в итемах


15-1200226339
Kostafey
2008-01-13 15:12
2008.02.17
С днем рождения ! 13 января


15-1200215446
Dark_Blue
2008-01-13 12:10
2008.02.17
Протестируйте тест





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский