В этом случае метод setTimeout()
определенно не подходит. Нет гарантии, что экземпляр облачной функции все еще будет работать через 8 часов.
Google еще не предоставляет планировщик для облачных функций, и лучше всего было бы создать очередь расписания какого-либо типа , Когда объект создается, добавьте задачу в очередь, чтобы удалить ее через 8 часов. Периодически (каждую минуту, скажем) запускается задание cron с помощью службы cron, которая запускает облачную функцию HTTPS, которая считывает очередь, чтобы увидеть, есть ли какие-либо объекты, которые будут действовать.
Альтернативно, если объект имеет связанное с этим время создания, вы можете периодически запускать облачную функцию HTTPS (инициированную внешним заданием cron, снова), которая выполняет запрос для объектов с истекшим сроком действия на основе их времени создания и удаляет их.
Вы можете использовать File#isDirectory()
, чтобы проверить, является ли данный файл (путь) каталогом. Если это true
, вы снова вызываете тот же метод с его результатом File#listFiles()
.
public static void main(String... args) {
File[] files = new File("C:/").listFiles();
showFiles(files);
}
public static void showFiles(File[] files) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getName());
showFiles(file.listFiles()); // Calls same method again.
} else {
System.out.println("File: " + file.getName());
}
}
}
Обратите внимание, что это чувствительно к StackOverflowError
.
], когда дерево глубже, чем может стека JVM. Вместо этого вы можете использовать итеративный подход или хвостовую рекурсию , но это другой предмет;)
Это дерево, поэтому рекурсия - ваш друг: начните с родительского каталога и вызовите метод, чтобы получить массив дочерних файлов. Итерация через дочерний массив. Если текущее значение является каталогом, передайте его рекурсивному вызову вашего метода. Если нет, обработайте файл листа соответствующим образом.
Использование org.apache.commons.io.FileUtils
File file = new File("F:/Lines");
Collection<File> files = FileUtils.listFiles(file, null, true);
for(File file2 : files){
System.out.println(file2.getName());
}
Используйте false, если вы не хотите файлы из подкаталогов.
Как уже отмечалось, это проблема рекурсии. В частности, вы можете посмотреть
listFiles()
В java File API здесь . Он возвращает массив всех файлов в каталоге. Использование этого вместе с
isDirectory()
для того, чтобы увидеть, нужно ли вам повторить, является хорошим началом.
Проверьте класс FileUtils в Apache Commons - в частности iterateFiles :
Позволяет итерацию по файлам в данной директории (и, необязательно, его подкаталоги).
blockquote>
Чтобы добавить с ответом @msandiford, как и в большинстве случаев, когда идет дерево файлов, вы можете захотеть выполнить функцию как каталог или какой-либо конкретный файл. Если u неохотно использует потоки. Можно переопределить следующие методы:
Files.walkFileTree(Paths.get(Krawl.INDEXPATH), EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException {
// Do someting before directory visit
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
// Do something when a file is visited
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc)
throws IOException {
// Do Something after directory visit
return FileVisitResult.CONTINUE;
}
});
Если вы используете Java 1.7, вы можете использовать java.nio.file.Files.walkFileTree(...)
.
Например:
public class WalkFileTreeExample {
public static void main(String[] args) {
Path p = Paths.get("/usr");
FileVisitor<Path> fv = new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
};
try {
Files.walkFileTree(p, fv);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Если вы используете Java 8 , вы можете использовать интерфейс потока с помощью java.nio.file.Files.walk(...)
:
public class WalkFileTreeExample {
public static void main(String[] args) {
try (Stream<Path> paths = Files.walk(Paths.get("/usr"))) {
paths.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Для Java 7+ существует также https://docs.oracle.com/javase/7/docs/api/java/nio/file/DirectoryStream.html
Пример, взятый из Javadoc:
List<Path> listSourceFiles(Path dir) throws IOException {
List<Path> result = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{c,h,cpp,hpp,java}")) {
for (Path entry: stream) {
result.add(entry);
}
} catch (DirectoryIteratorException ex) {
// I/O error encounted during the iteration, the cause is an IOException
throw ex.getCause();
}
return result;
}
NullPointerException
, когда файловая система изменяется между вызовомisDirectory
иlistFiles
, как это может произойти, еслиSystem.out.println
блокирует или вам просто просто не повезло. Проверка того, что выходlistFiles
не равен нулю, разрешит это условие гонки. – Mike Samuel 20 April 2014 в 19:00java.nio.file.DirectoryStream
позволяет вам перебирать каталог и может быть реализовано с небольшим объемом памяти но единственный способ сказать наверняка - следить за использованием памяти на определенной платформе. – Mike Samuel 5 October 2014 в 04:14