diff --git a/src/main/java/com/example/App.java b/src/main/java/com/example/App.java index 0dfbe27..fc0df54 100644 --- a/src/main/java/com/example/App.java +++ b/src/main/java/com/example/App.java @@ -20,8 +20,9 @@ public class App extends Application { scene = new Scene(loadFXML("primary"), 640, 480); stage.setScene(scene); stage.show(); + System.out.println("help"); - + System.err.println("App started with scene: " + scene); } @@ -36,6 +37,7 @@ public class App extends Application { public static void main(String[] args) { launch(); + } } \ No newline at end of file diff --git a/src/main/java/com/example/FileScannerTask.java b/src/main/java/com/example/FileScannerTask.java index 84e8e89..59e2fc5 100644 --- a/src/main/java/com/example/FileScannerTask.java +++ b/src/main/java/com/example/FileScannerTask.java @@ -1,6 +1,8 @@ package com.example; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -36,24 +38,43 @@ public class FileScannerTask extends Task> { * @throws Exception If an error occurs during the file scanning process. */ protected Map call() throws Exception { - int filesAmount = countFilesInDirectory(); - + long filesAmount = countFilesInDirectory(); + if (filesAmount == 0) { + updateProgress(filesAmount, filesAmount); + return fileTypeCounts; // Return empty map if no files found + } java.io.File directory = new java.io.File(directoryPath); if (directory.isDirectory()) { - java.io.File[] files = directory.listFiles(); - if (files != null) { - int i = 0; - for (java.io.File file : files) { - if (file.isFile()) { - String fileType = getFileExtension(file); - fileTypeCounts.put(fileType, fileTypeCounts.getOrDefault(fileType, 0) + 1); - } + java.util.concurrent.atomic.AtomicInteger i = new java.util.concurrent.atomic.AtomicInteger(0); - updateProgress(i, filesAmount); - i++; - } - } + Files.walk(directory.toPath()) + .filter(Files::isRegularFile) + .forEach(path -> { + try { + String fileType = getFileExtension(path.toFile()); + java.nio.file.attribute.BasicFileAttributes attrs = Files.readAttributes(path, java.nio.file.attribute.BasicFileAttributes.class); + // You can now access metadata like attrs.size(), attrs.creationTime(), attrs.lastModifiedTime(), etc. + fileTypeCounts.put(fileType, fileTypeCounts.getOrDefault(fileType, 0) + 1); + updateProgress(i.get(), filesAmount); + i.incrementAndGet(); + } catch (Exception e) { + e.printStackTrace(); + } + }); + + // java.io.File[] files = directory.listFiles(); + // if (files != null) { + // for (java.io.File file : files) { + // if (file.isFile()) { + // String fileType = getFileExtension(file); + // fileTypeCounts.put(fileType, fileTypeCounts.getOrDefault(fileType, 0) + 1); + // } + + // updateProgress(i.get(), filesAmount); + // i.incrementAndGet(); + // } + // } } return fileTypeCounts; @@ -64,14 +85,25 @@ public class FileScannerTask extends Task> { * * @param directoryPath The path to the directory. */ - public int countFilesInDirectory() { + public long countFilesInDirectory() { java.io.File directory = new java.io.File(directoryPath); if (directory.isDirectory()) { - java.io.File[] files = directory.listFiles(); - if (files != null) { - return files.length; + long fileCount = 0; + try { + fileCount = Files.walk(Paths.get(directoryPath)) + .filter(Files::isRegularFile) + .count(); + System.out.println("Number of files in directory: " + fileCount); + return fileCount; + } catch (java.io.IOException e) { + e.printStackTrace(); } + + // java.io.File[] files = directory.listFiles(); + // if (files != null) { + // return files.length; + // } } return 0; } diff --git a/src/main/java/com/example/FileSorterController.java b/src/main/java/com/example/FileSorterController.java index 188fdaf..8c896b9 100644 --- a/src/main/java/com/example/FileSorterController.java +++ b/src/main/java/com/example/FileSorterController.java @@ -34,6 +34,8 @@ public class FileSorterController { @FXML private void scan() throws IOException { + + progressBar.setProgress(0); errormessages.setText(""); // Clear previous error messages filesDiagram.getData().clear(); // Clear previous data from the bar chart // Check if the directory is valid @@ -81,12 +83,19 @@ public class FileSorterController { * @param fileTypeCounts A map where keys are file types and values are their respective counts. */ private void updateBarChart(Map fileTypeCounts) { - fileTypeCounts.forEach((fileType, count) -> { - javafx.scene.chart.XYChart.Series series = new javafx.scene.chart.XYChart.Series<>(); - series.setName(fileType); - series.getData().add(new javafx.scene.chart.XYChart.Data<>(fileType, count)); - filesDiagram.getData().add(series); - }); + if (fileTypeCounts == null || fileTypeCounts.isEmpty()) { + System.out.println("No files found or no file types to display."); + errormessages.setText("No files found or no file types to display."); + return; + + }else{ + fileTypeCounts.forEach((fileType, count) -> { + javafx.scene.chart.XYChart.Series series = new javafx.scene.chart.XYChart.Series<>(); + series.setName(fileType); + series.getData().add(new javafx.scene.chart.XYChart.Data<>(fileType, count)); + filesDiagram.getData().add(series); + }); + } } @@ -135,9 +144,15 @@ public class FileSorterController { filesamount.setText(String.valueOf(result.values().stream().mapToInt(Integer::intValue).sum())); }); service.start(); + // try { + // service.wait(); + // } catch (InterruptedException e) { + // e.printStackTrace(); + // errormessages.setText("Operation was interrupted."); + // } } - progressBar.paddingProperty().unbind(); - // progressBar.setProgress(0); // Reset progress bar before starting the service + progressBar.progressProperty().unbind(); + progressBar.setProgress(0); // Reset progress bar before starting the service final FileSorterService service = new FileSorterService(); service.setDirectoryPath(directory.getAbsolutePath()); diff --git a/src/main/java/com/example/FileSorterTask.java b/src/main/java/com/example/FileSorterTask.java index 9b4d26e..fa77dc5 100644 --- a/src/main/java/com/example/FileSorterTask.java +++ b/src/main/java/com/example/FileSorterTask.java @@ -30,8 +30,32 @@ public class FileSorterTask extends Task { protected Integer call() throws Exception { System.out.println("Scanning directory: " + directoryPath); int filesAmount = FileScannerTask.countFilesInDirectory(directoryPath); + + java.nio.file.Files.walk(java.nio.file.Paths.get(directoryPath)) + .filter(java.nio.file.Files::isRegularFile) + .forEach(path -> { + try { + // System.out.println("Processing file: " + path); + String[] parts = path.toString().split(java.util.regex.Pattern.quote(java.io.File.separator)); + java.nio.file.attribute.BasicFileAttributes attrs = java.nio.file.Files.readAttributes(path, java.nio.file.attribute.BasicFileAttributes.class); + // System.out.println(parts[(parts.length - 2)] + " - Creation Year: " + getCreationYear(path)); + if (parts[(parts.length - 2)].equals(String.valueOf(getCreationYear(path)))) { + // System.out.println("Skipping file: " + path + " due to invalid year"); + return; // Skip files with invalid year + + }else { + System.out.println("Processing file: " + path + " with valid year"); + } + // You can now access metadata like attrs.size(), attrs.creationTime(), attrs.lastModifiedTime(), etc. + + // Here you can add logic to handle file types if needed + } catch (Exception e) { + e.printStackTrace(); + } + }); + // Use a Set to track which year folders have already been created - AtomicInteger i = new AtomicInteger(0); + AtomicInteger i = new AtomicInteger(0); java.util.Set createdFolders = new java.util.HashSet<>(); java.nio.file.Files.list(java.nio.file.Paths.get(directoryPath)) .filter(java.nio.file.Files::isRegularFile) @@ -39,11 +63,8 @@ public class FileSorterTask extends Task { try { java.nio.file.attribute.BasicFileAttributes attrs = java.nio.file.Files.readAttributes(path, java.nio.file.attribute.BasicFileAttributes.class); // Use the earlier of creationTime and lastModifiedTime - java.time.Instant creationInstant = attrs.creationTime().toInstant(); - java.time.Instant modifiedInstant = attrs.lastModifiedTime().toInstant(); - java.time.Instant instant = creationInstant.isBefore(modifiedInstant) ? creationInstant : modifiedInstant; - java.time.ZonedDateTime zdt = java.time.ZonedDateTime.ofInstant(instant, java.time.ZoneId.systemDefault()); - String year = String.valueOf(zdt.getYear()); + + String year = String.valueOf(getCreationYear(path)); java.nio.file.Path targetDir = java.nio.file.Paths.get(directoryPath, year); // Only create the directory if it hasn't been created yet @@ -52,7 +73,7 @@ public class FileSorterTask extends Task { } java.nio.file.Path targetPath = targetDir.resolve(path.getFileName()); - java.nio.file.Files.copy(path, targetPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.move(path, targetPath, new java.nio.file.CopyOption[0]); updateProgress(i.get(), filesAmount); i.incrementAndGet(); } catch (Exception e) { @@ -62,6 +83,25 @@ public class FileSorterTask extends Task { // Implementation of file scanning logic goes here return 0; // Placeholder return value } + /** + * Gets the creation year of a file based on its attributes. + * + * @param path The path to the file. + * @return The year of creation or -1 if an error occurs. + */ + private int getCreationYear(java.nio.file.Path path) { + try { + java.nio.file.attribute.BasicFileAttributes attrs = java.nio.file.Files.readAttributes(path, java.nio.file.attribute.BasicFileAttributes.class); + java.time.Instant creationInstant = attrs.creationTime().toInstant(); + java.time.Instant modifiedInstant = attrs.lastModifiedTime().toInstant(); + java.time.Instant instant = creationInstant.isBefore(modifiedInstant) ? creationInstant : modifiedInstant; + java.time.ZonedDateTime zdt = java.time.ZonedDateTime.ofInstant(instant, java.time.ZoneId.systemDefault()); + return zdt.getYear(); + } catch (java.io.IOException e) { + e.printStackTrace(); + return -1; // Return an invalid year if an error occurs + } + } } diff --git a/target/classes/com/example/App.class b/target/classes/com/example/App.class index 3c4b267..bee14f2 100644 Binary files a/target/classes/com/example/App.class and b/target/classes/com/example/App.class differ diff --git a/target/classes/com/example/FileScannerTask.class b/target/classes/com/example/FileScannerTask.class index 7b2024f..a7f354f 100644 Binary files a/target/classes/com/example/FileScannerTask.class and b/target/classes/com/example/FileScannerTask.class differ diff --git a/target/classes/com/example/FileSorterController.class b/target/classes/com/example/FileSorterController.class index 46864a1..61ccee9 100644 Binary files a/target/classes/com/example/FileSorterController.class and b/target/classes/com/example/FileSorterController.class differ diff --git a/target/classes/com/example/FileSorterTask.class b/target/classes/com/example/FileSorterTask.class index 96f5958..329ab78 100644 Binary files a/target/classes/com/example/FileSorterTask.class and b/target/classes/com/example/FileSorterTask.class differ