Форум: "Прочее";
Текущий архив: 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.57 MB
Время: 0.044 c