private bool LoadCacheFile(IFileInfo target, IDocument remoteDocument, IFileSystemInfoFactory fsFactory) {
if (this.TransmissionStorage == null) {
return false;
}
IFileTransmissionObject obj = this.TransmissionStorage.GetObjectByRemoteObjectId(remoteDocument.Id);
if (obj == null) {
return false;
}
IFileInfo localFile = fsFactory.CreateFileInfo(obj.LocalPath);
if (!localFile.Exists) {
return false;
}
if (obj.LastChangeToken != remoteDocument.ChangeToken || localFile.Length != obj.LastContentSize) {
localFile.Delete();
return false;
}
try {
byte[] localHash;
using (var f = localFile.Open(FileMode.Open, FileAccess.Read, FileShare.None)) {
localHash = SHA1Managed.Create().ComputeHash(f);
}
if (!localHash.SequenceEqual(obj.LastChecksum)) {
localFile.Delete();
return false;
}
if (target.FullName != obj.LocalPath) {
if (target.Exists) {
Guid? uuid = target.Uuid;
if (uuid != null) {
localFile.Uuid = uuid;
}
target.Delete();
}
localFile.MoveTo(target.FullName);
target.Refresh();
}
return true;
} catch (Exception) {
localFile.Delete();
return false;
}
}