import java.io.File;
import java.io.IOException;
import java.util.*;
//import java.lang.Object;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class AppendTool {
public static void main(String[] args){
    
    Scanner sc = new Scanner(System.in);
    System.out.println("Input Directory to Append Values: ");
    String dirInput = sc.nextLine();
    System.out.println("Input value to append to Directory Files: ");
    String valInput = sc.nextLine();
    
    sc.close();
    
    Path source = Paths.get(dirInput);
    
    File path = new File(dirInput);

    File [] files = path.listFiles();
    for (int i = 0; i < files.length; i++){
        if (files[i].isFile()){ //this line weeds out other directories/folders
            System.out.println(files[i]);
       try {     
           // int where = files[i].getName().lastIndexOf(".");
            String result = valInput + files[i].getName();//.substring(0, where) + files[i].getName().substring(where);
            System.out.println(result);
            File dest = new File(result);
           //Files.move(files[i].toPath(), dest.toPath().resolveSibling(dest.getName()), StandardCopyOption.REPLACE_EXISTING);   
            Files.move(source, source.resolveSibling(dest.getName()), StandardCopyOption.REPLACE_EXISTING);
            System.out.println(dest);
            return;
       } catch (IOException e) {
            e.printStackTrace();
          }
            }   
    }
  }
 }

I'm trying to iterate through all files in a directory and append a value to each filename. Using Files.move creates a FileSystemException and states that the file is being used by another process. Using the commented-out Files.move(files[i].toPath.....) deletes creates the new file, deletes the old one from the directory, but it does not replace the original file. Any help would be appreciated. For the error below, I have a stuff.txt file saved in documents and I wanted to append "e" to the filename.

C:\Users\Bob\Documents -> C:\Users\Bob\estuff.txt: The process cannot access the file because it is being used by another process

at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92) at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103) at java.base/sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:395) at java.base/sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:292) at java.base/java.nio.file.Files.move(Files.java:1426) at AppendTool.main(AppendTool.java:36)

1

There are 1 answers

0
DevilsHnd - 退した On

You are getting the error because the the parameter arguments for the Files.move() method are wrong. You need to supply the full path and file name of the source file (the original file name) and the source.resolveSibling() method need to be supplied the full path and file name of the destination file which in this case happens to the the original file name with the desired text inserted into the beginning of it.

Here is a quick example of how to achieve this:

Scanner sc = new Scanner(System.in);
System.out.println("Input Directory path to modify file names in:");
System.out.print("Directory Path: --> ");
String dirInput = sc.nextLine();

/* 'DO' take the time to ensure that OS file naming rules 
   are strictly followed when accepting User Input!!   */
System.out.print("Enter the text you want to insert into\n"
               + "the begining of each file name within\n"
               + "this directory: --> ");
String valInput = sc.nextLine();

// Close ONLY if you won't ever need it again in this application.
sc.close(); 
System.out.println();
    
File path = new File(dirInput);
File[] files = path.listFiles();

for (File file : files) {
    if (!file.isFile()) { continue; }
    Path source = Paths.get(file.getAbsolutePath());
    File newName = new File(file.getParent() + File.separator + valInput + file.getName());
    System.out.println(newName.getAbsolutePath());
    try {
        Files.move(source, source.resolveSibling(newName.getAbsolutePath()),
                                       StandardCopyOption.REPLACE_EXISTING);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}