Skip to content

Commit 19532ec

Browse files
authored
Merge pull request #517 from Ayowel/fix/change-workdir-with-unavailable-drive-letter
Ensure that the DirectoryService's Chooser uses a valid directory path
2 parents 914a3b2 + 47a602f commit 19532ec

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

src/main/java/com/kodedu/service/DirectoryService.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import java.io.File;
1717
import java.nio.file.Files;
18+
import java.nio.file.FileSystems;
1819
import java.nio.file.Path;
1920
import java.util.List;
2021
import java.util.Objects;
@@ -74,10 +75,7 @@ public DirectoryChooser newDirectoryChooser(String title) {
7475
DirectoryChooser directoryChooser = new DirectoryChooser();
7576
directoryChooser.setTitle(title);
7677
initialDirectory.ifPresent(file -> {
77-
if (Files.isDirectory(file.toPath()))
78-
directoryChooser.setInitialDirectory(file);
79-
else
80-
directoryChooser.setInitialDirectory(file.toPath().getParent().toFile());
78+
directoryChooser.setInitialDirectory(getChooserInitialDirectory(file));
8179
});
8280
return directoryChooser;
8381
}
@@ -86,15 +84,31 @@ public FileChooser newFileChooser(String title) {
8684
final FileChooser fileChooser = new FileChooser();
8785
fileChooser.setTitle(title);
8886
initialDirectory.ifPresent(file -> {
89-
if (Files.isDirectory(file.toPath()))
90-
fileChooser.setInitialDirectory(file);
91-
else
92-
fileChooser.setInitialDirectory(file.toPath().getParent().toFile());
87+
fileChooser.setInitialDirectory(getChooserInitialDirectory(file));
9388
});
9489

9590
return fileChooser;
9691
}
9792

93+
/**
94+
* Resolve a file to a valid base browsing directory
95+
* @param referenceFile The base directory or a child file that should be used as a browsing base path
96+
* @return A valid directory's File object
97+
*/
98+
private static File getChooserInitialDirectory(File referenceFile) {
99+
// Search for an existing directory
100+
while (referenceFile != null){
101+
if(Files.isDirectory(referenceFile.toPath())) {
102+
return referenceFile;
103+
}
104+
referenceFile = referenceFile.getParentFile();
105+
}
106+
107+
// No parent file could be found or referenceFile
108+
// Default to returning a path to the first drive available
109+
return FileSystems.getDefault().getRootDirectories().iterator().next().toFile();
110+
}
111+
98112
public Path workingDirectory() {
99113
return workingDirectory.orElseGet(this::workingDirectorySupplier);
100114
}

0 commit comments

Comments
 (0)