2015-02-25 2 views
1

Я пишу корпоративное приложение, которое будет синхронизировать локальные папки/файлы (One Way Server -> Local) с идентичными папками/файлами в общем сетевом файле Windows Server. Я использую метод File.Copy, включенный в .NET Framework, и работает почти безупречно. Я копирую файлы с сервера, если они не существуют на локальном ПК, если они существуют, я сравниваю измененные даты и перезаписываю их, если версия сервера более новая.Синхронизация файлов

У меня возникают проблемы, когда приложение копирует большой файл и прерывается по какой-либо причине, и копируемый файл не заканчивается. Локальный файл, который был прерван, показывает, что он имеет тот же размер, что и копия сервера, хотя только небольшая часть его переносится, но если вы попытаетесь открыть ее в этом случае, скажем, ее .zip или .pst-файл, вы можете видеть, что это поврежден и не открывается.

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

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

3

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

Для того, чтобы быть уверенным, что все файлы совпадают, вы можете рассчитать хэш-массив для обоих файлов и сравнить их. Например, используя SHA algorithm. Это потребует полного чтения обоих файлов, поэтому это может повлиять на скорость синхронизации.

1

Никогда не используйте дату или размер изменения файла, вместо этого вы можете использовать (LOCKS), который является скрытым небольшим файлом, который хранит блокировки для каждого файла в папке, например (File1) на сервере имеет файл блокировки (File1.lock) он содержит журналы даты создания и изменения ... Если вы копируете новый файл для перезаписи File1, блокировка будет иметь значение 0 (например), а после завершения копирования оно изменится на единицу, поэтому, если блокировка имеет значение Zero, что означает, что последняя попытка перезаписать файл не удалась по какой-либо причине и так далее ... Эта идея похожа на менее подробную информацию о продуктах subversion, таких как черепаха ... Также, как упоминалось ранее, вы можете, конечно, использовать MS SYNC FRAMEWORK ...

2

Скопируйте файл в сетевой ресурс под другим именем. например: MyFile-copying-in-process.dat

После того, как он закончил без ошибок, просто переименуйте файл в сетевой папке в правильное имя: например: MyFile.dat.

Смежные вопросы