package javaforce.utils;
/** File operations (used by jfile)
*
* @author pquiring
*/
import java.io.*;
import java.util.*;
import javaforce.*;
public class jfileop extends javax.swing.JFrame {
/**
* Creates new form jfileop
*/
public jfileop() {
initComponents();
JF.centerWindow(this);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
txt1 = new javax.swing.JLabel();
progress = new javax.swing.JProgressBar();
cancel = new javax.swing.JButton();
txt2 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
txt1.setText("Status : ...");
cancel.setText("Cancel");
cancel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelActionPerformed(evt);
}
});
txt2.setText("To : ...");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(txt1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(progress, javax.swing.GroupLayout.DEFAULT_SIZE, 353, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(cancel))
.addComponent(txt2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(txt1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txt2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(progress, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cancel)
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed
if (worker != null) {
worker.abort = true;
}
}//GEN-LAST:event_cancelActionPerformed
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
if (worker != null) {
if (worker.abort == true) {
System.exit(0);
}
worker.abort = true;
}
}//GEN-LAST:event_formWindowClosing
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
if (args == null || args.length == 0) {
System.out.println("Usage:jcp src(s) dest");
System.out.println("Usage:jmv src(s) dest");
System.out.println("Usage:jrm file(s)");
return;
}
final String _args[] = args;
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
jfileop fop = new jfileop();
fop.setVisible(true);
fop.start(_args);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancel;
private javax.swing.JProgressBar progress;
private javax.swing.JLabel txt1;
private javax.swing.JLabel txt2;
// End of variables declaration//GEN-END:variables
private String cmd[];
private Worker worker;
private Timer timer;
private boolean done;
private String msg1, msg2;
private boolean hidetxt2;
private long amtComplete, amtTodo;
public void start(String cmd[]) {
this.cmd = cmd;
worker = new Worker();
worker.start();
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
update();
}
});
}
}, 500, 500);
}
private String fit(String in) {
if (in.length() < 25) {
return in;
}
int idx = in.indexOf(" ");
String p1 = in.substring(0,idx+1);
return p1 + "..." + in.substring(in.length() - (25 - p1.length()));
}
private synchronized void update() {
if (msg1 != null) txt1.setText(fit(msg1));
if (msg2 != null) txt2.setText(fit(msg2));
if (hidetxt2) {
hidetxt2 = false;
txt2.setVisible(false);
}
if (amtTodo == 0) return;
int percent;
if (done) {
percent = 100;
} else {
percent = (int)(amtComplete * 100 / amtTodo);
}
progress.setValue(percent);
}
public static class Op {
public String src, dest;
public Op(String s, String d) {
src=s;
dest=d;
}
}
public class Worker extends Thread {
ArrayList<Op> ops = new ArrayList<Op>();
boolean abort;
public void run() {
//do the actual work
try {
if (cmd[0].equals("cp")) {
setTitle("Copying...");
msg1 = "Scanning files...";
String dest = cmd[cmd.length-1];
for(int a=1;a<cmd.length-1;a++) {
ops.add(new Op(cmd[a], dest));
}
amtTodo = getFileSize();
copy();
} else if (cmd[0].equals("mv")) {
setTitle("Moving...");
msg1 = "Scanning files...";
String dest = cmd[cmd.length-1];
for(int a=1;a<cmd.length-1;a++) {
ops.add(new Op(cmd[a], dest));
}
amtTodo = getFileCount();
move();
} else if (cmd[0].equals("rm")) {
setTitle("Deleting...");
hidetxt2 = true;
amtTodo = getFileCount();
for(int a=1;a<cmd.length;a++) {
remove(cmd[a]);
}
}
} catch (Exception e) {}
System.exit(0);
}
public long getFileSize() {
long size = 0;
for (int a=0;a<ops.size();a++) {
if (abort) return 0;
String src = ops.get(a).src;
if (new File(src).isDirectory()) {
size += getDirectorySize(src);
} else {
size += getFileSize(src);
}
}
return size;
}
public long getFileSize(String file) {
return new File(file).length();
}
public long getDirectorySize(String dir) {
long size = 4096;
File files[] = new File(dir).listFiles();
if (files == null) return 0;
for(int a=0;a<files.length;a++) {
if (abort) return 0;
if (files[a].isDirectory()) {
size += getDirectorySize(files[a].getAbsolutePath());
} else {
size += getFileSize(files[a].getAbsolutePath());
}
}
return size;
}
public long getFileCount() {
long size = 0;
for (int a=0;a<ops.size();a++) {
if (abort) return 0;
String src = ops.get(a).src;
if (new File(src).isDirectory()) {
size += getDirectoryCount(src);
} else {
size += getFileCount(src);
}
}
return size;
}
public long getFileCount(String file) {
return 1;
}
public long getDirectoryCount(String dir) {
long size = 1;
File files[] = new File(dir).listFiles();
if (files == null) return 0;
for(int a=0;a<files.length;a++) {
if (abort) return 0;
if (files[a].isDirectory()) {
size += getDirectorySize(files[a].getAbsolutePath());
} else {
size += getFileSize(files[a].getAbsolutePath());
}
}
return size;
}
public void copy() {
while (ops.size() > 0) {
if (abort) return;
Op op = ops.remove(0);
File srcFile = new File(op.src);
if (srcFile.isDirectory()) {
copyDirectory(op.src, op.dest + "/" + srcFile.getName());
} else {
copyFile(op.src, op.dest);
}
}
}
public final static int bufsiz = 64 * 1024;
public byte buf[] = new byte[bufsiz];
public void copyFile(String src, String destFolder) {
msg1 = "Copying " + src;
msg2 = "To " + destFolder;
long amtBefore = amtComplete;
FileInputStream fis = null;
FileOutputStream fos = null;
File srcFile = new File(src);
File destFile = new File(destFolder, srcFile.getName());
long size = srcFile.length();
try {
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(destFile);
long copied = 0;
long left = size;
int toRead;
while (copied < size) {
if (abort) throw new Exception("abort");
if (left > bufsiz) {
toRead = bufsiz;
} else {
toRead = (int)left;
}
int read = fis.read(buf, 0, toRead);
if (read <= 0) {
throw new Exception("read error");
}
fos.write(buf, 0, read);
copied += read;
left -= read;
}
fis.close();
fis = null;
fos.close();
fos = null;
} catch (Exception e) {
try { if (fis != null) fis.close(); } catch (Exception e1) {}
try { if (fos != null) fos.close(); } catch (Exception e2) {}
destFile.delete();
if (abort) return;
if (JF.showConfirm("Copy Error", "Failed to copy:" + src + "\nRetry?")) {
ops.add(new Op(src, destFolder));
amtComplete = amtBefore;
} else {
amtComplete = amtBefore + size;
}
}
}
public void copyDirectory(String src, String dest) {
msg1 = "Copying " + src;
msg2 = "To " + dest;
File srcFolder = new File(src);
File destFolder = new File(dest);
while ((!destFolder.exists()) && !destFolder.mkdir()) {
if (abort) return;
if (!JF.showConfirm("Copy Error", "Failed to create folder:" + destFolder.getAbsolutePath() + "\nRetry?")) {
return;
}
}
amtComplete += 4096;
File files[] = srcFolder.listFiles();
if (files == null) return;
for(int a=0;a<files.length;a++) {
if (abort) return;
boolean isDir = files[a].isDirectory();
if (isDir) {
copyDirectory(files[a].getAbsolutePath(), dest + "/" + files[a].getName());
} else {
copyFile(files[a].getAbsolutePath(), dest);
}
}
}
public void move() {
while (ops.size() > 0) {
if (abort) return;
Op op = ops.remove(0);
move(op.src, op.dest);
}
}
public void move(String src, String dest) {
msg1 = "Moving " + src;
msg2 = "To " + dest;
File srcFile = new File(src);
File destFile = new File(dest, srcFile.getName());
while (!srcFile.renameTo(destFile)) {
if (!JF.showConfirm("Move Error", "Failed to move:" + src + "\nRetry?")) {
return;
}
}
amtComplete++;
}
public void remove(String name) {
if (abort) return;
msg1 = "Deleting " + name;
File file = new File(name);
if (file.isDirectory()) {
removeDirectory(name);
} else {
while (!file.delete()) {
if (!JF.showConfirm("Delete Error", "Failed to delete:" + name + "\nRetry?")) {
return;
}
}
amtComplete++;
}
}
public void removeDirectory(String name) {
File files[] = new File(name).listFiles();
msg1 = "Deleting " + name;
if (files != null) {
for(int a=0;a<files.length;a++) {
if (abort) return;
remove(files[a].getAbsolutePath());
}
}
File dir = new File(name);
while (!dir.delete()) {
if (!JF.showConfirm("Delete Error", "Failed to delete:" + name + "\nRetry?")) {
return;
}
}
amtComplete++;
}
}
}