/*
* Written By Charles M. Chen
* charlesmchen@gmail.com
* Created on Mar 1, 2005
*
*
*
*
*/
package org.cmc.music.util;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Vector;
/**
* @author charles
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class MyFileSystem
{
public static final String file_seperator = System
.getProperty("file.separator");
public static final MyComparator kFILE_BY_DATE = new MyComparator() {
public int compare(Object o1, Object o2)
{
File f1 = (File) o1;
File f2 = (File) o2;
if (f1.lastModified() > f2.lastModified())
return 1;
if (f1.lastModified() < f2.lastModified())
return -1;
return 0;
}
};
public String getExtension(File file)
{
if (file == null)
return null;
String name = file.getName();
int index = name.lastIndexOf('.');
if (index < 0)
return null;
return name.substring(index + 1).toLowerCase();
}
public String getExtensionNonNull(File file)
{
String ext = getExtension(file);
if (ext == null)
return "";
return ext;
}
public String getFilenameWithoutExtension(File file)
{
if (file == null)
return null;
String name = file.getName();
int index = name.lastIndexOf('.');
if (index < 0)
return name;
return name.substring(0, index);
}
public void delete(File file)
{
if (file.isFile())
{
file.delete();
} else if (file.isDirectory())
{
File files[] = file.listFiles();
if (files != null)
{
for (int i = 0; i < files.length; i++)
delete(files[i]);
}
file.delete();
}
}
public interface RenamingFilter
{
public String filter(String s);
}
public void copy_to_folder(File src, File dst) throws IOException
{
copy_to_folder(src, dst, null);
}
public void copy_to_folder(File src, File dst, RenamingFilter filter)
throws IOException
{
if (src.isFile())
{
String old_name = src.getName();
if (filter != null)
old_name = filter.filter(old_name);
if (old_name != null)
{
File new_file = new File(dst, old_name);
new_file.getParentFile().mkdirs();
new FileIO().copyToFile(src, new_file);
}
} else if (src.isDirectory())
{
String old_name = src.getName();
if (filter != null)
old_name = filter.filter(old_name);
if (old_name != null)
{
File new_folder = new File(dst, old_name);
File files[] = src.listFiles();
if (files != null)
{
for (int i = 0; i < files.length; i++)
copy_to_folder(files[i], new_folder);
}
}
// file.delete();
}
}
public void copy_contents_to_folder(File src, File dst) throws IOException
{
copy_contents_to_folder(src, dst, null);
}
public void copy_contents_to_folder(File src, File dst,
RenamingFilter filter) throws IOException
{
if (src.exists() && src.isDirectory())
{
String old_name = src.getName();
if (filter != null)
old_name = filter.filter(old_name);
if (old_name != null)
{
File files[] = src.listFiles();
if (files != null)
{
for (int i = 0; i < files.length; i++)
copy_to_folder(files[i], dst);
}
}
}
}
public long getByteCount(Vector v)
{
long result = 0;
for (int i = 0; i < v.size(); i++)
{
File file = (File) v.get(i);
if (file.isFile())
result += file.length();
}
return result;
}
public File getNewestFile(Vector v)
{
File newest = null;
long mod = Long.MIN_VALUE;
for (int i = 0; i < v.size(); i++)
{
File file = (File) v.get(i);
if (file.lastModified() > mod)
{
mod = file.lastModified();
newest = file;
}
}
return newest;
}
public Vector getChildrenFiles(File file)
{
return getChildren(file, false, true);
}
public Vector getChildrenFolders(File file)
{
return getChildren(file, true, false);
}
public Vector getChildrenFilesAndFolders(File file)
{
return getChildren(file, true, true);
}
private Vector getChildren(File file, boolean include_folders,
boolean include_files)
{
Vector result = new Vector();
if (null == file)
return null;
if (!file.exists())
return null;
if (file.isFile())
{
if (include_files)
result.add(file);
} else if (file.isDirectory())
{
File files[] = file.listFiles();
if (null != files)
{
Arrays.sort(files);
for (int i = 0; i < files.length; i++)
{
Vector v = (getChildren(files[i], include_folders,
include_files));
if (v != null)
result.addAll(v);
}
}
if (include_folders)
result.add(file);
}
return result;
}
public Vector filterFoldersOnly(Vector v)
{
Vector result = new Vector();
for (int i = 0; i < v.size(); i++)
{
File file = (File) v.get(i);
if ((file.exists()) && (file.isDirectory()))
result.add(file);
}
return result;
}
public Vector filterFilesOnly(Vector v)
{
Vector result = new Vector();
for (int i = 0; i < v.size(); i++)
{
File file = (File) v.get(i);
if ((file.exists()) && (file.isFile()))
result.add(file);
}
return result;
}
public interface BackupFilter
{
public boolean copy(File file);
public boolean delete(File file);
}
public void backup(File src, File dst, boolean debug)
{
backup(src, dst, null, debug);
}
public void backup(
// Listener listener, boolean debug, boolean nice,
// boolean root, boolean reverse,
File src, File dst, BackupFilter filter, boolean debug)
{
try
{
if ((null != filter) && (!filter.copy(src)))
return;
if (src.isFile())
{
if (dst.exists())
{
// delete(
// // debug, nice, reverse,
// dst);
if (!dst.isFile())
{
if ((null != filter) && (!filter.delete(dst)))
return;
System.out.println(
// (mode.delete_obstruction()
// ? ""
// : "not ")
// +
"deleting obstruction: "
+ dst.getAbsolutePath());
// if (mode.delete_obstruction())
// {
if (!debug)
delete(
// debug, nice, reverse,
dst);
// }
} else if (
// mode.overwrite_existing() &&
(src.lastModified() > dst.lastModified()))
{
if ((null != filter) && (!filter.delete(dst)))
return;
System.out.println("deleting non-matching: "
+ dst.getAbsolutePath());
if (!debug)
delete(
// debug, nice, reverse,
dst);
}
}
if (!dst.exists())
{
System.out
.println("copying file: " + dst.getAbsolutePath());
if (!debug)
{
dst.getParentFile().mkdirs();
copy_to_folder(src, dst.getParentFile());
// check_nice(nice);
}
}
} else if (src.isDirectory())
{
{
if (dst.exists() && !dst.isDirectory())
{
if ((null != filter) && (!filter.delete(dst)))
return;
System.out.println(
// (mode.delete_obstruction()
// // ? ""
// // : "not ")
// // +
"deleting obstructing file: "
+ dst.getAbsolutePath());
// if (mode.delete_obstruction())
if (!debug)
{
delete(
// debug, nice, reverse,
dst);
}
}
if (!dst.exists())
{
System.out.println("making dir: "
+ dst.getAbsolutePath());
if (!debug)
dst.mkdirs();
}
}
{ // step one, copy over...
File files[] = src.listFiles();
// sort(files, reverse);
Arrays.sort(files, MyComparator.kFileName);
for (int i = 0; i < files.length; i++)
{
File child_src = files[i];
File child_dst = new File(dst, child_src.getName());
backup(
// listener, debug, nice, false, reverse,
child_src, child_dst, filter, debug);
// if (root)
// {
// if (listener != null)
// {
// listener.log("copy " + child_src.getName());
//
// listener.setProgress(i, files.length);
// }
// }
}
}
// if (mode.delete_missing())
{ // step two, delete extraneous...
if (dst.exists() && dst.isDirectory())
{
File files[] = dst.listFiles();
// sort(files, reverse);
Arrays.sort(files, MyComparator.kFileName);
for (int i = 0; i < files.length; i++)
{
File child_dst = files[i];
File child_src = new File(src, child_dst.getName());
if (!child_src.exists())
{
if ((null != filter)
&& (!filter.delete(child_dst)))
return;
System.out.println("deleting obsolete file: "
+ child_dst.getAbsolutePath());
if (!debug)
delete(
// debug, nice, reverse,
child_dst);
// child_dst.delete();
}
// if (root)
// {
// if (listener != null)
// {
// listener.log("delete "
// + child_src.getName());
//
// listener.setProgress(i, files.length);
// }
// }
}
}
}
}
} catch (Exception e)
{
Debug.debug(e);
}
}
}