mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-17 02:01:27 +00:00
faster directory moving (no recursive iteration on filesystem needed any longer)
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package org.cryptomator.common;
|
||||
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
@@ -40,4 +41,8 @@ public class WeakValuedCache<Key, Value> {
|
||||
}
|
||||
}
|
||||
|
||||
public void forEach(BiConsumer<Key, Value> function) {
|
||||
delegate.asMap().forEach(function);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -13,8 +13,6 @@ import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.nio.file.FileAlreadyExistsException;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
@@ -27,7 +25,6 @@ import org.cryptomator.common.WeakValuedCache;
|
||||
import org.cryptomator.crypto.engine.Cryptor;
|
||||
import org.cryptomator.filesystem.Deleter;
|
||||
import org.cryptomator.filesystem.File;
|
||||
import org.cryptomator.filesystem.FileSystemVisitor;
|
||||
import org.cryptomator.filesystem.Folder;
|
||||
import org.cryptomator.filesystem.Node;
|
||||
import org.cryptomator.io.FileContents;
|
||||
@@ -142,7 +139,7 @@ class CryptoFolder extends CryptoNode implements Folder {
|
||||
throw new IllegalStateException("Newly created folder, that didn't exist before, already had an directoryId.");
|
||||
}
|
||||
if (parent.file(name).exists()) {
|
||||
throw new UncheckedIOException(new FileAlreadyExistsException(toString()));
|
||||
throw new UncheckedIOException(new FileAlreadyExistsException(parent.file(name).toString()));
|
||||
}
|
||||
FileContents.UTF_8.writeContents(dirFile, directoryId.get());
|
||||
dir.create();
|
||||
@@ -167,10 +164,6 @@ class CryptoFolder extends CryptoNode implements Folder {
|
||||
target.parent().get().create();
|
||||
target.delete();
|
||||
|
||||
// determine subFolder as long as we can still browse our current hierarchy:
|
||||
Collection<Folder> subFolders = new HashSet<>();
|
||||
FileSystemVisitor.fileSystemVisitor().beforeFolder(subFolders::add).visit(this);
|
||||
|
||||
// perform the actual move:
|
||||
final File dirFile = forceGetPhysicalFile();
|
||||
final String dirId = getDirectoryId().get();
|
||||
@@ -180,10 +173,8 @@ class CryptoFolder extends CryptoNode implements Folder {
|
||||
}
|
||||
dirFile.moveTo(target.forceGetPhysicalFile());
|
||||
|
||||
// invalidate the directory id of any directory beneath the _old_ location:
|
||||
subFolders.stream().filter(CryptoFolder.class::isInstance).map(CryptoFolder.class::cast).forEach(folder -> {
|
||||
folder.directoryId.set(null);
|
||||
});
|
||||
// cut all ties:
|
||||
this.invalidateDirectoryIdsRecursively();
|
||||
|
||||
assert!exists();
|
||||
assert target.exists();
|
||||
@@ -198,7 +189,14 @@ class CryptoFolder extends CryptoNode implements Folder {
|
||||
Deleter.deleteContent(this);
|
||||
forceGetPhysicalFolder().delete();
|
||||
forceGetPhysicalFile().delete();
|
||||
invalidateDirectoryIdsRecursively();
|
||||
}
|
||||
|
||||
private void invalidateDirectoryIdsRecursively() {
|
||||
directoryId.set(null);
|
||||
folders.forEach((name, folder) -> {
|
||||
folder.invalidateDirectoryIdsRecursively();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user