private bool DeleteLocalObjectIfHasBeenSyncedBefore(IFileSystemInfo fsInfo) {
bool delete = true;
string reason;
Guid? uuid = fsInfo.Uuid;
IMappedObject obj = null;
if (uuid != null) {
obj = this.Storage.GetObjectByGuid((Guid)uuid);
} else {
obj = this.Storage.GetObjectByLocalPath(fsInfo);
}
if (fsInfo is IFileInfo) {
if (obj != null && fsInfo.LastWriteTimeUtc.Equals(obj.LastLocalWriteTimeUtc)) {
(fsInfo as IFileInfo).Delete();
OperationsLogger.Info(string.Format("Deleted local file {0} because the mapped remote object {0} has been deleted", fsInfo.FullName, obj.RemoteObjectId));
} else {
fsInfo.Uuid = null;
return false;
}
} else if (fsInfo is IDirectoryInfo) {
var dir = fsInfo as IDirectoryInfo;
if (obj != null && obj.Ignored) {
dir.Delete(true);
return true;
}
if (!this.filters.FolderNamesFilter.CheckFolderName(dir.Name, out reason)) {
foreach (var folder in dir.GetDirectories()) {
if (!this.DeleteLocalObjectIfHasBeenSyncedBefore(folder)) {
delete = false;
}
}
foreach (var file in dir.GetFiles()) {
if (!this.filters.FileNamesFilter.CheckFile(file.Name, out reason)) {
if (!this.DeleteLocalObjectIfHasBeenSyncedBefore(file)) {
delete = false;
}
} else {
file.Delete();
OperationsLogger.Info(string.Format("Deleted local ignored file {0} because the mapped remote parent object {0} has been deleted", fsInfo.FullName, obj.RemoteObjectId));
}
}
if (delete) {
try {
(fsInfo as IDirectoryInfo).Delete(false);
OperationsLogger.Info(string.Format("Deleted local folder {0} because the mapped remote folder has been deleted", fsInfo.FullName));
} catch (IOException) {
fsInfo.Uuid = null;
return false;
}
} else {
fsInfo.Uuid = null;
}
} else {
try {
(fsInfo as IDirectoryInfo).Delete(true);
OperationsLogger.Info(string.Format("Deleted locally ignored folder {0} because the parent mapped remote folder has been deleted", fsInfo.FullName));
} catch (IOException e) {
OperationsLogger.Info(string.Format("Deletion of locally ignored folder {0} failed", fsInfo.FullName), e);
return false;
}
}
}
return delete;
}
}