I have a working file rename java tool, now I want to add an if condition to run a commandline command if I checked a box as part of the rename process on each file it renames.
I will be changing the dos code later, but its a sample I found that works. Part of my problem is my filerename is its own class, so I will also need to figure out how to combine this class or reference the dos command somehow from my main rename class.
update
I updated the code with the changes from the answer, but the commandline command does not work and it crashes java with no error. The command does work from cmd line.
import java.io.IOException;
import java.io.InputStream;
public class doscommandrun {
public static void run() {
final String dosCommand = "cmd converter.exe file.doc -android -o file.txt";
try {
final Process process = Runtime.getRuntime().exec(
dosCommand + " ");
final InputStream in = process.getInputStream();
int ch;
while((ch = in.read()) != -1) {
System.out.print((char)ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
enter code hereFile rename code:
private void renameFile(){
boolean operationResult = false;
boolean overallResult = true;
int failCount = 0;
/* the operation of this part is ensured by the chooseDirectory()
* WE get the list of files in the directory
* get the conditions set by users
* and perform the file rename operation.
*/
//Let's get all the information from user
String[] fileList = directory.list(); //the list of files in the directory
String Prefix = txtPrefix.getText();
String Rename = txtRename.getText();
String Suffix = txtSuffix.getText();
String digits = (String) cboSequence.getSelectedItem();
int StartingNum;
String generatedSequence;
File oldFile;
//let's call the output frame
if(cbxOutput.isSelected() && OUTPUT_ON == false){
buildOutput();
OUTPUT_ON = true;
}
//display the list of files and readability of each file
for(int i = 0; i < fileList.length; i++){
oldFile = new File(directory.getPath()+"/"+ fileList[i]);
String readability = fileList[i] +" - readable?: "+oldFile.canRead();
System.out.println(readability);
if(OUTPUT_ON)
txaOutput.append("\n"+readability);
}
for(int i = 0; i < fileList.length; i++){
/* get the file extension that we need, and form a new name,
* we would check if the Ignore File Extension is selected
*/
oldFile = new File(directory.getPath()+"/"+ fileList[i]);
String fileExtension;
if(cbxIgnoreExtension.isSelected() == true ){
fileExtension = "";
}
else
fileExtension = getFileExtension(fileList[i]);
//this part get the original filename
String fileName = getFileName(fileList[i]);
String inputInfo = "The input filename->"+ fileList[i] + "\nfile name->" + fileName + "\nextension->" + fileExtension;
System.out.println(inputInfo);
if(OUTPUT_ON)
txaOutput.append("\n"+inputInfo);
/* generate sequence for the Name
*if the digits selection is NONE, we ignore it
*/
if(digits.equals("None") == true){
generatedSequence = "";
}
else{
StartingNum = Integer.parseInt(txtSequence.getText());
generatedSequence = nameSequence(StartingNum + i, digits);
}
//this is affected by the RenameOption, if Rename has something then only we RENAME
if(cbxRename.isSelected() == true){
fileName = Rename + generatedSequence; //the fileName will change.
}
else{
//if Rename has nothing, but the txtSequence has some Value, we take it to the naming too
fileName = fileName.substring(0,4)+ generatedSequence;
if(cbxAndroid.isSelected() == true ){
doscommandrun.run();
}
//the New File Name
String newFileName = Prefix + fileName.substring(0,4) + Suffix + fileExtension;
String tentativeName = "new Filename will be ->"+newFileName+"\n";
System.out.println(tentativeName);
if(OUTPUT_ON)
txaOutput.append("\n"+tentativeName);
// ! Perform the file rename, if the Experimental Mode is not selected
if(cbxExperiment.isSelected() == false){
operationResult = oldFile.renameTo(new File(directory.getPath()+"/"+newFileName));
String renameResult = "\t*Rename successfully?: " + operationResult+"\n\n";
System.out.println(renameResult);
if(operationResult == false)
failCount++;
if(OUTPUT_ON)
txaOutput.append("\n"+renameResult);
//make up the overall result
overallResult = (operationResult && overallResult);
}
}
if(cbxExperiment.isSelected() == false){
System.out.println("Overall Result: "+overallResult);
if(overallResult)
JOptionPane.showMessageDialog(null, "All files renamed successfully!");
else
JOptionPane.showMessageDialog(null, "File renamed with "+ failCount+ " failure(s)");
}//end if
}
}//end renameFile
You can create a static method in the doccommandrun class called run() which will execute what is currently in the main method when called.
public class DosCommandRun
{
public static void run()
{
//..do stuff from main
}
}
Now whenever you want to call the dos command you can just insert DosCommandRun.run() into your code.
I add /c after the cmd in my renametool class
I am still having issues but wither a different problem.
Related
I am having difficulty passing a directory to the code below. When I am prompted to enter a directory, I do as shown below: C:\Users. I get a 0 byte output, which is not accurate. Meaning that the program is not registering the typed directory.
code:
//import jdk.internal.icu.text.UnicodeSet;
import java.io.File;
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
public class Hwk2018
{
public static void main(String[] args)
{
//String s = "C:\\Users\\
//File filess = new File(s);
System.out.println("Enter a directory or a file: ");
Scanner input = new Scanner(System.in);
String directory = input.nextLine();
Hwk2018 obj = new Hwk2018();
System.out.println(obj.getSize(new File(directory)) + " bytes");
}
int i = 0;
Queue<File> que = new LinkedList<>();
public long getSSize(File directory)
{
long size = 0;
que.add(directory);
while(!que.isEmpty())
{
File t = que.poll();
if(!t.isDirectory())
{
size += t.length();
}
else
{
//for(int i = 0; )
que.add(directory);
}
}
return size;
}
public static long getSize(File file)
{
long size = 0;
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; files != null && i < files.length; i++) {
size += getSize(files[i]);
}
} else {
size += file.length();
}
return size;
}
}
output when running ' MBP src % java Hwk2018 ' on the terminal and subsequently typing C:\Users:
0 bytes
Expected Output:
87 bytes (or some numerical value other than 0)
I would use File#exists to verify that the user input is a valid path, you could also add File#isDirectory check, but since getSize is doing this, it's probably not required.
subsequently typing C:\Users:
I'm using a Mac
Mac's don't have a concept of "drives" like windows, they have "volumes" and as such it should probably be /Users, but you could run into other issues, since you won't have read access to other users.
The following will print the path of your "home" directory and also uses File#exist to verify the user input
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//String s = "C:\\Users\\
//File filess = new File(s);
String directory = System.getProperty("user.home");
System.out.println("Your home directory is [" + directory + "]");
System.out.println("Enter a directory or a file: ");
Scanner input = new Scanner(System.in);
directory = input.nextLine();
File parent = new File(directory);
if (parent.exists()) {
Main obj = new Main();
System.out.println(obj.getSize(new File(directory)) + " bytes");
} else {
System.out.println(directory + " is not a valid directory");
}
}
public static long getSize(File file) {
long size = 0;
System.out.println("Scanning " + file.getName());
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; files != null && i < files.length; i++) {
size += getSize(files[i]);
}
} else {
size += file.length();
}
return size;
}
}
I currently have 2 loops, one which gets a timestamp, and another while loop to find the mapped information based off that time stamp and output in a certain way.
Issue I have is I am currently looping through a text, and want it to start reading the file from the beginning again when the isdone="N" for the second loop, however, this does not seem to be the case.
Code so far:
public static void organiseFile() throws FileNotFoundException {
String directory = "C:\\Users\\xxx\\Desktop\\Files\\ex1";
Scanner fileIn = new Scanner(new File(directory + "_temp.txt"));
Scanner readIn = new Scanner(new File(directory + ".txt"));
PrintWriter out = new PrintWriter(directory + "_ordered.txt");
ArrayList<String> lines = new ArrayList<String>();
String readTimeStamp = "";
String timeStampMapping = "";
String outputFirst = "";
String outputSecond = "";
String outputThird = "";
String previousTimeStamp = "";
String doneList = "";
String isdone = "";
int counter = 1;
// Loop to get time stamps
while(fileIn.hasNextLine()) {
readTimeStamp = fileIn.nextLine();
if(readTimeStamp != null && readTimeStamp.trim().length() > 0) {
readTimeStamp = readTimeStamp.substring(12, 25);
System.out.println(readTimeStamp);
// Previous time stamp found, no need to loop through it again
if(doneList.contains(readTimeStamp))
isdone = "Y";
// Counter in place to stop outputting the first record, otherwise output file and clear variables down
else if(!previousTimeStamp.equals(readTimeStamp) && counter > 1) {
out.println(outputFirst + outputSecond + outputThird);
System.out.println("Outputting....");
outputFirst = "";
outputSecond = "";
outputThird = "";
counter = 1;
}
// New time stamp found, start finding values in second loop
else
isdone = "N";
// Secondary loop to find match of record
while(readIn.hasNextLine() && isdone.equals("N")) {
System.out.println("Mapping...");
timeStampMapping = readIn.nextLine();
System.out.println(timeStampMapping);
// When a record has been found with matching time stamps, start ordering
if(timeStampMapping.contains(readTimeStamp)) {
previousTimeStamp = readTimeStamp;
System.out.println(previousTimeStamp);
if(timeStampMapping.contains("[EVENT=agentStateEvent]")) {
outputFirst += timeStampMapping + "\r\n";
} else if(timeStampMapping.contains("[EVENT=TerminalConnectionCreated]")) {
outputSecond += timeStampMapping + "\r\n";
} else {
outputThird += timeStampMapping + "\r\n";
doneList += readTimeStamp + ",";
}
counter++;
}
}
}
}
System.out.println("Outputting final record");
out.println(outputFirst + outputSecond + outputThird);
System.out.println("Complete!");
out.close();
}
You can use Scanner.reset() to reset it to the beginning of the file. For example, after your second while-loop include:
if (isdone.equals("Y")) {
fileIn.reset();
}
Btw: why are you using String for isdone instead of boolean??
I'm doing a Phone Directory project and we have to read from a directory file telnos.txt
I'm using a Scanner to load the data from the file telnos.txt, using a loadData method from a previous question I asked here on StackOverflow.
I noticed attempts to find a user always returned Not Found, so I added a few System.out.printlns in the methods to help me see what was going on. It looks like the scanner isn't reading anything from the file. Weirdly, it is printing the name of the file as what should be the first line read, which makes me think I've missed something very very simple here.
Console
run:
telnos.txt
null
loadData tested successfully
Please enter a name to look up: John
-1
Not found
BUILD SUCCESSFUL (total time: 6 seconds)
ArrayPhoneDirectory.java
import java.util.*;
import java.io.*;
public class ArrayPhoneDirectory implements PhoneDirectory {
private static final int INIT_CAPACITY = 100;
private int capacity = INIT_CAPACITY;
// holds telno of directory entries
private int size = 0;
// Array to contain directory entries
private DirectoryEntry[] theDirectory = new DirectoryEntry[capacity];
// Holds name of data file
private final String sourceName = "telnos.txt";
File telnos = new File(sourceName);
// Flag to indicate whether directory was modified since it was last loaded or saved
private boolean modified = false;
// add method stubs as specified in interface to compile
public void loadData(String sourceName) {
Scanner read = new Scanner("telnos.txt").useDelimiter("\\Z");
int i = 1;
String name = null;
String telno = null;
while (read.hasNextLine()) {
if (i % 2 != 0)
name = read.nextLine();
else
telno = read.nextLine();
add(name, telno);
i++;
}
}
public String lookUpEntry(String name) {
int i = find(name);
String a = null;
if (i >= 0) {
a = name + (" is at position " + i + " in the directory");
} else {
a = ("Not found");
}
return a;
}
public String addChangeEntry(String name, String telno) {
for (DirectoryEntry i : theDirectory) {
if (i.getName().equals(name)) {
i.setNumber(telno);
} else {
add(name, telno);
}
}
return null;
}
public String removeEntry(String name) {
for (DirectoryEntry i : theDirectory) {
if (i.getName().equals(name)) {
i.setName(null);
i.setNumber(null);
}
}
return null;
}
public void save() {
PrintWriter writer = null;
// writer = new PrintWriter(FileWriter(sourceName));
}
public String format() {
String a;
a = null;
for (DirectoryEntry i : theDirectory) {
String b;
b = i.getName() + "/n";
String c;
c = i.getNumber() + "/n";
a = a + b + c;
}
return a;
}
// add private methods
// Adds a new entry with the given name and telno to the array of
// directory entries
private void add(String name, String telno) {
System.out.println(name);
System.out.println(telno);
theDirectory[size] = new DirectoryEntry(name, telno);
size = size + 1;
}
// Searches the array of directory entries for a specific name
private int find(String name) {
int result = -1;
for (int count = 0; count < size; count++) {
if (theDirectory[count].getName().equals(name)) {
result = count;
}
System.out.println(result);
}
return result;
}
// Creates a new array of directory entries with twice the capacity
// of the previous one
private void reallocate() {
capacity = capacity * 2;
DirectoryEntry[] newDirectory = new DirectoryEntry[capacity];
System.arraycopy(theDirectory, 0, newDirectory,
0, theDirectory.length);
theDirectory = newDirectory;
}
}
ArrayPhoneDirectoryTester.java
import java.util.Scanner;
public class ArrayPhoneDirectoryTester {
public static void main(String[] args) {
//create a new ArrayPhoneDirectory
PhoneDirectory newTest = new ArrayPhoneDirectory();
newTest.loadData("telnos.txt");
System.out.println("loadData tested successfully");
System.out.print("Please enter a name to look up: ");
Scanner in = new Scanner(System.in);
String name = in.next();
String entryNo = newTest.lookUpEntry(name);
System.out.println(entryNo);
}
}
telnos.txt
John
123
Bill
23
Hello
23455
Frank
12345
Dkddd
31231
In your code:
Scanner read = new Scanner("telnos.txt");
Is not going to load file 'telnos.txt'. It is instead going to create a Scanner object that scans the String "telnos.txt".
To make the Scanner understand that it has to scan a file you have to either:
Scanner read = new Scanner(new File("telnos.txt"));
or create a File object and pass its path to the Scanner constructor.
In case you are getting "File not found" errors you need to check the current working directory. You could run the following lines and see if you are indeed in the right directory in which the file is:
String workingDir = System.getProperty("user.dir");
System.out.println("Current working directory : " + workingDir);
You need to also catch the FileNotFoundException in the function as follows:
public void loadData(String sourceName) {
try {
Scanner read = new Scanner(new File("telnos.txt")).useDelimiter("\\Z");
int i = 1;
String name = null;
String telno = null;
while (read.hasNextLine()) {
if (i % 2 != 0)
name = read.nextLine();
else {
telno = read.nextLine();
add(name, telno);
}
i++;
}
}catch(FileNotFoundException ex) {
System.out.println("File not found:"+ex.getMessage);
}
}
You are actually parsing the filename not the actual file contents.
Instead of:
new Scanner("telnos.txt")
you need
new Scanner( new File( "telnos.txt" ) )
http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
I have a method which processes a line to seperate the first word which it puts into a string called cmd and the rest which it enters into a vector of strings for the parameters and then sends them to a function to process the command. The parameters are getting wrapped in square braces for some reason.
static private boolean processLine(String line) {
if (debug) System.out.println("DEBUG: processLine \"" + line + "\"");
line = new String(line.trim());
String cmd = new String();
Vector<String> params = new Vector<String>(3);
boolean hasparam = false;
Scanner s = new Scanner(line).useDelimiter(" ");
int x = 0;
while (s.hasNext()) {
if (x == 0) { cmd = s.next(); }
else if (x >= 1) {
params.add(s.next());
hasparam = true;
}
x++;
}
// Next we process the command.
processCmd(cmd, params);
return exit;
}
static private void processCmd(String cmd, Vector<String> params) {
boolean invalid = false;
if (debug) {
System.out.print("DEBUG: processCmd " + cmd);
if (params.size() == 0) System.out.println();
else for (String param : params)
System.out.println(" " + params);
}
Output:
> add hosting
DEBUG: processLine "add hosting"
DEBUG: processCmd add [hosting]
I'm not sure why I am getting this behaviour, and I would like an explanation as well as a solution.
The parameters are getting wrapped in square braces for some reason.
This is because you are printing the Vector itself rather than the element of Vector. So toString() method of Vector is calling out in following line:
System.out.println(" " + params);
Change this line to:
System.out.println(" " + param);
Like the title suggests I want to batch rename files but keep the first 4 characters of the file name.
Trying to modify this open source batchfilerenametool for personal use. Any suggestions?
I added the code that renames the file. Where it says filename = filename + generatedSequence; pretty sure that is where I need to add it, but what would specify just the first 4 characters of the file name?
//this is affected by the RenameOption, if Rename has something then only we RENAME
if(cbxRename.isSelected() == true){
fileName = Rename + generatedSequence; //the fileName will change.
}
else {
//if Rename has nothing, but the txtSequence has some Value, we take it to the naming too
fileName = fileName + generatedSequence;
}
Below is the rename part of the code.
private void renameFile(){
boolean operationResult = false;
boolean overallResult = true;
int failCount = 0;
/* the operation of this part is ensured by the chooseDirectory()
* WE get the list of files in the directory
* get the conditions set by users
* and perform the file rename operation.
*/
//Let's get all the information from user
String[] fileList = directory.list(); //the list of files in the directory
String Prefix = txtPrefix.getText();
String Rename = txtRename.getText();
String Suffix = txtSuffix.getText();
String digits = (String) cboSequence.getSelectedItem();
int StartingNum;
String generatedSequence;
File oldFile;
//let's call the output frame
if(cbxOutput.isSelected() && OUTPUT_ON == false){
buildOutput();
OUTPUT_ON = true;
}
//display the list of files and readability of each file
for(int i = 0; i < fileList.length; i++){
oldFile = new File(directory.getPath()+"/"+ fileList[i]);
String readability = fileList[i] +" - readable?: "+oldFile.canRead();
System.out.println(readability);
if(OUTPUT_ON)
txaOutput.append("\n"+readability);
}
for(int i = 0; i < fileList.length; i++){
/* get the file extension that we need, and form a new name,
* we would check if the Ignore File Extension is selected
*/
oldFile = new File(directory.getPath()+"/"+ fileList[i]);
String fileExtension;
if(cbxIgnoreExtension.isSelected() == true ){
fileExtension = "";
}
else
fileExtension = getFileExtension(fileList[i]);
//this part get the original filename
String fileName = getFileName(fileList[i]);
String inputInfo = "The input filename->"+ fileList[i] + "\nfile name->" + fileName + "\nextension->" + fileExtension;
System.out.println(inputInfo);
if(OUTPUT_ON)
txaOutput.append("\n"+inputInfo);
/* generate sequence for the Name
*if the digits selection is NONE, we ignore it
*/
if(digits.equals("None") == true){
generatedSequence = "";
}
else{
StartingNum = Integer.parseInt(txtSequence.getText());
generatedSequence = nameSequence(StartingNum + i, digits);
}
//this is affected by the RenameOption, if Rename has something then only we RENAME
if(cbxRename.isSelected() == true){
fileName = Rename + generatedSequence; //the fileName will change.
}
else{
//if Rename has nothing, but the txtSequence has some Value, we take it to the naming too
fileName = fileName + generatedSequence;
}
//the New File Name
String newFileName = Prefix + fileName + Suffix + fileExtension;
String tentativeName = "new Filename will be ->"+newFileName+"\n";
System.out.println(tentativeName);
if(OUTPUT_ON)
txaOutput.append("\n"+tentativeName);
// ! Perform the file rename, if the Experimental Mode is not selected
if(cbxExperiment.isSelected() == false){
operationResult = oldFile.renameTo(new File(directory.getPath()+"/"+newFileName));
String renameResult = "\t*Rename successfully?: " + operationResult+"\n\n";
System.out.println(renameResult);
if(operationResult == false)
failCount++;
if(OUTPUT_ON)
txaOutput.append("\n"+renameResult);
//make up the overall result
overallResult = (operationResult && overallResult);
}
}
if(cbxExperiment.isSelected() == false){
System.out.println("Overall Result: "+overallResult);
if(overallResult)
JOptionPane.showMessageDialog(null, "All files renamed successfully!");
else
JOptionPane.showMessageDialog(null, "File renamed with "+ failCount+ " failure(s)");
}//end if
}//end renameFile
Part of String can be selected via String.substring(start, end) method:
filename = filename.substring(0, 4) + generatedSequence;
In general you should not use constant end parameter since original String may be shorter so it is good idea to limit it to length of String:
filename = filename.substring(0, Math.min(4, filename.length())) + generatedSequence;