@Override
  public ValidationResult validate(File toDir) throws IOException {
    File toFile = getFile(toDir);
    ValidationResult result = doValidateAccess(toFile, ValidationResult.Action.DELETE, false);
    if (result != null) return result;

    if (myPatch.validateDeletion(getPath()) && toFile.exists() && isModified(toFile)) {
      ValidationResult.Option[] options = myPatch.isStrict()
                                          ? new ValidationResult.Option[]{ValidationResult.Option.DELETE}
                                          : new ValidationResult.Option[]{ValidationResult.Option.DELETE, ValidationResult.Option.KEEP};
      if (getChecksum() == Digester.INVALID) {
        ValidationResult.Action action = ValidationResult.Action.VALIDATE;
        String details = "checksum 0x" + Long.toHexString(myPatch.digestFile(toFile));
        return new ValidationResult(ValidationResult.Kind.CONFLICT, getPath(), action, UpdaterUI.message("file.unexpected"), details, options);
      }
      else {
        ValidationResult.Action action = ValidationResult.Action.DELETE;
        String details = "expected 0x" + Long.toHexString(getChecksum()) + ", actual 0x" + Long.toHexString(myPatch.digestFile(toFile));
        return new ValidationResult(ValidationResult.Kind.CONFLICT, getPath(), action, UpdaterUI.message("file.modified"), details, options);
      }
    }

    return null;
  }
@Override
  public ValidationResult validate(File toDir)