¿Por qué está obsoleto Files.deleteDirectoryContents () en Guava?

En Guava 10+, Google desaprobó Files.deleteDirectoryContents () . JavaDoc dice

Obsoleto. Este método adolece de una pobre detección de enlaces simbólicos y condiciones de carrera. Esta funcionalidad solo se puede admitir adecuadamente mediante el desplazamiento a un comando del sistema operativo como rm -rf o del / s. Este método está programado para ser eliminado de Guava en Guava versión 11.0

Estoy confundido sobre por qué hay una condición de carrera. Creo que tener este método es realmente útil y encontrar una solución deficiente al sistema operativo. ¿Pueden los autores compartir por qué tomaron esta decisión?

Respuesta 1

La condición de carrera es potencialmente peor que "el directorio podría no estar vacío", y esto se debe en parte a la detección de enlaces simbólicos deficiente. Considere este fragmento de código:

// Symbolic links will have different canonical and absolute paths
if (!directory.getCanonicalPath().equals(directory.getAbsolutePath())) {
  return;
}
... delete its contents ...

Si directoryes un directorio simple durante la verificación pero es un enlace simbólico para /después, deleteDirectoryContentsintentaremos borrar todo el sistema de archivos.

Quizás haya una solución, pero no la hemos encontrado. Y hacer correcciones ad hoc para un posible error de seguridad es aterrador.

Respuesta: 2

Para obtener más ejemplos de detección de enlaces simbólicos rotos, consulte estos errores archivados por los usuarios .

En resumen, es imposible borrar un directorio a menos que proporcione la ruta canónica a ese directorio. Si /tmpes un enlace a /some/other/directory, deleteDirectoryContentsno se puede borrar /tmp/mytempdirectory. Quizás haya una posible solución aquí también, pero alzamos las manos.

Respuesta: 3

Tengo esta situación en la que tengo una relación padre-hijo entre dos conjuntos de datos. Tengo una colección de documentos primarios y una colección de documentos secundarios. El requisito es que los padres y ...

Con AWT, ¿cómo importa una imagen en un rectángulo que ha dibujado? Quiero asignar el fondo solo a ese rectángulo en particular.

Tengo una devolución de llamada con instancia de excepción. Actualmente lo manejo de esta manera, pero creo que hay una mejor manera. Me gustaría escuchar algún comentario de un experto en Java. =) ... onError (Excepción e) {...

Todo me parece correcto: obtener un objeto de resultados, obtener una matriz de series, obtener un objeto en el índice y obtener una matriz de datos. privado void downloadAllData () lanza JSONException {queryApi (); JSONObject ...