/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
/**
*
*/
package com.ewcms.common.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.RandomAccessFile;
import java.io.StringReader;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ewcms.web.vo.TreeNode;
import java.util.Date;
/**
* 日 期: 2008-2-14 12:05:18<br />
* project: zxj <br />
* 作 者:wangmingjie<br />
*/
public class FileUtil {
private static Logger logger = LoggerFactory.getLogger(FileUtil.class);
private static final int G_SIZE = 1024 * 1024 * 1024;
private static final int M_SIZE = 1024 * 1024;
private static final int K_SIZE = 1024;
/**
* 创建单个文件夹。
*
* @param dir
* @param ignoreIfExitst true表示如果文件夹存在就不再创建了。false是重新创建。
* @throws IOException
*/
public static void createDir(String dir, boolean ignoreIfExitst) throws IOException {
File file = new File(dir);
if (ignoreIfExitst && file.exists()) {
return;
}
if (file.mkdir() == false) {
throw new IOException("Cannot create the directory = " + dir);
}
}
/**
* 创建多个文件夹
*
* @param dir
* @param ignoreIfExitst
* @throws IOException
*/
public static void createDirs(String dir, boolean ignoreIfExitst)
throws IOException {
File file = new File(dir);
if (ignoreIfExitst && file.exists()) {
return;
}
if (file.mkdirs() == false) {
throw new IOException("Cannot create directories = " + dir);
}
}
public static void delete(final String path) throws IOException {
File file = new File(path);
delete(file);
}
public static void delete(final File file) throws IOException {
if (!file.exists()) {
return;
}
if (file.isFile()) {
deleteFile(file);
} else {
deleteDir(file);
}
}
public static void deleteFile(final String path) throws IOException {
File file = new File(path);
deleteFile(file);
}
/**
* 删除一个文件。
*
* @param filename
* @throws IOException
*/
public static void deleteFile(File file) throws IOException {
if (file.isDirectory()) {
throw new IOException(
"IOException -> BadInputException: not a file.");
}
if (file.exists() == false) {
return;
}
if (file.delete() == false) {
throw new IOException("Cannot delete file. filename = " + file.getPath());
}
}
public static void deleteDir(final String path) throws IOException {
File file = new File(path);
deleteDir(file);
}
/**
* 删除文件夹及其下面的子文件夹
*
* @param dir
* @throws IOException
*/
public static void deleteDir(File dir) throws IOException {
if (dir.isFile()) {
throw new IOException(
"IOException -> BadInputException: not a directory.");
}
File[] files = dir.listFiles();
if (files == null) {
dir.delete();
return;
}
for (File file: files) {
if (file.isFile()) {
file.delete();
} else {
deleteDir(file);
}
}
}
public static String getPathSeparator() {
return java.io.File.pathSeparator;
}
public static String getFileSeparator() {
return java.io.File.separator;
}
public static FileInfo getFileInfo(File f) throws IOException {
if (f.isDirectory()) {
return null;
}
FileInfo info = new FileInfo();
long tempFLen = f.length();
if (tempFLen / G_SIZE > 0) {
info.setLength(tempFLen / G_SIZE + " G");
} else if (tempFLen / M_SIZE > 0) {
info.setLength(tempFLen / M_SIZE + " M");
} else if (tempFLen / K_SIZE > 0) {
info.setLength(tempFLen / K_SIZE + " K");
} else {
info.setLength(tempFLen + " byte");
}
info.setModifyTime(DateFormat.getDateTimeInstance().format(new Date(f.lastModified())));
info.setName(f.getName());
info.setPath(getFilePath(f));
return info;
}
/**
* 获取到目录下面文件的大小。包含了子目录。
*
* @param dir
* @return
* @throws IOException
*/
public static long getDirLength(File dir) throws IOException {
if (dir.isFile()) {
throw new IOException("BadInputException: not a directory.");
}
long size = 0;
File[] files = dir.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
File file = files[i];
long length = 0;
if (file.isFile()) {
length = file.length();
} else {
length = getDirLength(file);
}
size += length;
}
}
return size;
}
/**
* 将文件清空。
*
* @param srcFilename
* @throws IOException
*/
public static void emptyFile(String srcFilename) throws IOException {
File srcFile = new File(srcFilename);
if (!srcFile.exists()) {
throw new FileNotFoundException("Cannot find the file: "
+ srcFile.getAbsolutePath());
}
if (!srcFile.canWrite()) {
throw new IOException("Cannot write the file: "
+ srcFile.getAbsolutePath());
}
FileOutputStream outputStream = new FileOutputStream(srcFilename);
outputStream.close();
}
/**
* 把输入数据流,写入指定的文件中
*
* @param stream
* @param fileName
* @throws IOException
*/
public static void writerFile(final InputStream stream,
final String fileName) throws IOException {
File file = createFile(fileName);
OutputStream out = new FileOutputStream(file);
try {
byte[] bf = new byte[1024 * 10];
int len = 0;
while ((len = stream.read(bf)) > 0) {
out.write(bf, 0, len);
}
out.close();
} catch (IOException e) {
logger.error("Error", e);
throw e;
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException ex) {
}
}
}
/**
* Write content to a fileName with the destEncoding 写文件。如果此文件不存在就创建一个。
*
* @param content
* String
* @param fileName
* String
* @param destEncoding
* String
* @throws FileNotFoundException
* @throws IOException
*/
public static void writeFile(String content, String fileName,
String destEncoding) throws FileNotFoundException, IOException {
File file = createFile(fileName);
BufferedWriter out = null;
try {
FileOutputStream fos = new FileOutputStream(file);
out = new BufferedWriter(new OutputStreamWriter(fos, destEncoding));
out.write(content);
out.flush();
} catch (FileNotFoundException fe) {
logger.error("Error", fe);
throw fe;
} catch (IOException e) {
logger.error("Error", e);
throw e;
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException ex) {
}
}
}
private static File createFile(final String fileName) throws IOException {
File file = new File(fileName);
if (!file.exists()) {
if (file.createNewFile() == false) {
throw new IOException("create file '" + fileName + "' failure.");
}
}
if (file.isFile() == false) {
throw new IOException("'" + fileName + "' is not a file.");
}
if (file.canWrite() == false) {
throw new IOException("'" + fileName + "' is a read-only file.");
}
return file;
}
/**
* 读取文件的内容,并将文件内容以字符串的形式返回。
*
* @param fileName
* @param srcEncoding
* @return
* @throws FileNotFoundException
* @throws IOException
*/
public static String readFile(String fileName, String srcEncoding)
throws FileNotFoundException, IOException {
File file = null;
try {
file = new File(fileName);
if (file.isFile() == false) {
throw new IOException("'" + fileName + "' is not a file.");
}
} finally {
// we dont have to close File here
}
BufferedReader reader = null;
try {
StringBuffer result = new StringBuffer(1024);
FileInputStream fis = new FileInputStream(fileName);
reader = new BufferedReader(new InputStreamReader(fis, srcEncoding));
char[] block = new char[512];
while (true) {
int readLength = reader.read(block);
if (readLength == -1) {
break;// end of file
}
result.append(block, 0, readLength);
}
return result.toString();
} catch (FileNotFoundException fe) {
logger.error("Error", fe);
throw fe;
} catch (IOException e) {
logger.error("Error", e);
throw e;
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException ex) {
}
}
}
/*
* 1 ABC 2 abC Gia su doc tu dong 1 lay ca thay 5 dong => 1 --> 5 3 ABC
*/
public static String[] getLastLines(File file, int linesToReturn)
throws IOException, FileNotFoundException {
final int AVERAGE_CHARS_PER_LINE = 250;
final int BYTES_PER_CHAR = 2;
RandomAccessFile randomAccessFile = null;
StringBuffer buffer = new StringBuffer(linesToReturn
* AVERAGE_CHARS_PER_LINE);
int lineTotal = 0;
try {
randomAccessFile = new RandomAccessFile(file, "r");
long byteTotal = randomAccessFile.length();
long byteEstimateToRead = linesToReturn * AVERAGE_CHARS_PER_LINE
* BYTES_PER_CHAR;
long offset = byteTotal - byteEstimateToRead;
if (offset < 0) {
offset = 0;
}
randomAccessFile.seek(offset);
// log.debug("SKIP IS ::" + offset);
String line = null;
String lineUTF8 = null;
while ((line = randomAccessFile.readLine()) != null) {
lineUTF8 = new String(line.getBytes("ISO8859_1"), "UTF-8");
lineTotal++;
buffer.append(lineUTF8).append("\n");
}
} finally {
if (randomAccessFile != null) {
try {
randomAccessFile.close();
} catch (IOException ex) {
}
}
}
String[] resultLines = new String[linesToReturn];
BufferedReader in = null;
try {
in = new BufferedReader(new StringReader(buffer.toString()));
int start = lineTotal /* + 2 */ - linesToReturn; // Ex : 55 - 10 = 45
// ~ offset
if (start < 0) {
start = 0; // not start line
}
for (int i = 0; i < start; i++) {
in.readLine(); // loop until the offset. Ex: loop 0, 1 ~~ 2
// lines
}
int i = 0;
String line = null;
while ((line = in.readLine()) != null) {
resultLines[i] = line;
i++;
}
} catch (IOException ie) {
logger.error("Error" + ie);
throw ie;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ex) {
}
}
}
return resultLines;
}
public static void copyFileOrDir(String src, String dest, boolean overwrite) throws IOException {
File srcFile = new File(src);
// 首先判断源文件是否存在
if (!srcFile.exists()) {
throw new FileNotFoundException("Cannot find the source file: "
+ srcFile.getAbsolutePath());
}
File destFile = new File(dest);
if (srcFile.isFile()) {
if (destFile.isDirectory()) {
throw new IOException("copy dest must is file: " + destFile.getAbsolutePath());
}
copyFile(srcFile, destFile, overwrite);
} else {
if (destFile.isFile()) {
throw new IOException("copy dest must is directory: " + destFile.getAbsolutePath());
}
copyFiles(src, dest, overwrite);
}
}
/**
* 单个文件拷贝。
*
* @param srcFilename
* @param destFilename
* @param overwrite
* @throws IOException
*/
public static void copyFile(String srcFilename, String destFilename,
boolean overwrite) throws IOException {
File srcFile = new File(srcFilename);
File destFile = new File(destFilename);
copyFile(srcFile, destFile, overwrite);
}
/**
* 单个文件拷贝。
*
* @param srcFile
* @param destFile
* @param overwrite
* 是否覆盖目的文件
* @throws IOException
*/
public static void copyFile(File srcFile, File destFile, boolean overwrite)
throws IOException {
// 首先判断源文件是否存在
if (!srcFile.exists()) {
throw new FileNotFoundException("Cannot find the source file: "
+ srcFile.getAbsolutePath());
}
// 判断源文件是否可读
if (!srcFile.canRead()) {
throw new IOException("Cannot read the source file: "
+ srcFile.getAbsolutePath());
}
if (overwrite == false) {
// 目标文件存在就不覆盖
if (destFile.exists()) {
return;
}
} else {
// 如果要覆盖已经存在的目标文件,首先判断是否目标文件可写。
if (destFile.exists()) {
if (!destFile.canWrite()) {
throw new IOException("Cannot write the destination file: "
+ destFile.getAbsolutePath());
}
} else {
// 不存在就创建一个新的空文件。
if (!destFile.createNewFile()) {
throw new IOException("Cannot write the destination file: "
+ destFile.getAbsolutePath());
}
}
}
BufferedInputStream inputStream = null;
BufferedOutputStream outputStream = null;
byte[] block = new byte[1024];
try {
inputStream = new BufferedInputStream(new FileInputStream(srcFile));
outputStream = new BufferedOutputStream(new FileOutputStream(
destFile));
while (true) {
int readLength = inputStream.read(block);
if (readLength == -1) {
break;// end of file
}
outputStream.write(block, 0, readLength);
}
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException ex) {
// just ignore
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException ex) {
// just ignore
}
}
}
}
/**
* 拷贝文件,从源文件夹拷贝文件到目的文件夹。 <br>
* 参数源文件夹和目的文件夹,最后都不要带文件路径符号,例如:c:/aa正确,c:/aa/错误。
*
* @param srcDirName
* 源文件夹名称 ,例如:c:/test/aa 或者c:\\test\\aa
* @param destDirName
* 目的文件夹名称,例如:c:/test/aa 或者c:\\test\\aa
* @param overwrite
* 是否覆盖目的文件夹下面的文件。
* @throws IOException
*/
public static void copyFiles(String srcDirName, String destDirName,
boolean overwrite) throws IOException {
File srcDir = new File(srcDirName);// 声明源文件夹
// 首先判断源文件夹是否存在
if (!srcDir.exists()) {
throw new FileNotFoundException(
"Cannot find the source directory: "
+ srcDir.getAbsolutePath());
}
File destDir = new File(destDirName);
if (overwrite == false) {
if (destDir.exists()) {
// do nothing
} else {
if (destDir.mkdirs() == false) {
throw new IOException(
"Cannot create the destination directories = "
+ destDir);
}
}
} else {
// 覆盖存在的目的文件夹
if (destDir.exists()) {
// do nothing
} else {
// create a new directory
if (destDir.mkdirs() == false) {
throw new IOException(
"Cannot create the destination directories = "
+ destDir);
}
}
}
// 循环查找源文件夹目录下面的文件(屏蔽子文件夹),然后将其拷贝到指定的目的文件夹下面。
File[] srcFiles = srcDir.listFiles();
if (srcFiles == null || srcFiles.length < 1) {
// throw new IOException ("Cannot find any file from source
// directory!!!");
return;// do nothing
}
// 开始复制文件
int SRCLEN = srcFiles.length;
for (int i = 0; i < SRCLEN; i++) {
// File tempSrcFile = srcFiles[i];
File destFile = new File(destDirName + File.separator
+ srcFiles[i].getName());
// 注意构造文件对象时候,文件名字符串中不能包含文件路径分隔符";".
// log.debug(destFile);
if (srcFiles[i].isFile()) {
copyFile(srcFiles[i], destFile, overwrite);
} else {
// 在这里进行递归调用,就可以实现子文件夹的拷贝
copyFiles(srcFiles[i].getAbsolutePath(), destDirName
+ File.separator + srcFiles[i].getName(), overwrite);
}
}
}
/**
* 压缩文件。注意:中文文件名称和中文的评论会乱码。
*
* @param srcFilename
* @param destFilename
* @param overwrite
* @throws IOException
*/
public static void zipFile(String srcFilename, String destFilename,
boolean overwrite) throws IOException {
File srcFile = new File(srcFilename);
// 首先判断源文件是否存在
if (!srcFile.exists()) {
throw new FileNotFoundException("Cannot find the source file: "
+ srcFile.getAbsolutePath());
}
// 判断源文件是否可读
if (!srcFile.canRead()) {
throw new IOException("Cannot read the source file: "
+ srcFile.getAbsolutePath());
}
if (destFilename == null || destFilename.trim().equals("")) {
destFilename = srcFilename + ".zip";
} else {
destFilename += ".zip";
}
File destFile = new File(destFilename);
if (overwrite == false) {
// 目标文件存在就不覆盖
if (destFile.exists()) {
return;
}
} else {
// 如果要覆盖已经存在的目标文件,首先判断是否目标文件可写。
if (destFile.exists()) {
if (!destFile.canWrite()) {
throw new IOException("Cannot write the destination file: "
+ destFile.getAbsolutePath());
}
} else {
// 不存在就创建一个新的空文件。
if (!destFile.createNewFile()) {
throw new IOException("Cannot write the destination file: "
+ destFile.getAbsolutePath());
}
}
}
BufferedInputStream inputStream = null;
BufferedOutputStream outputStream = null;
ZipOutputStream zipOutputStream = null;
byte[] block = new byte[1024];
try {
inputStream = new BufferedInputStream(new FileInputStream(srcFile));
outputStream = new BufferedOutputStream(new FileOutputStream(
destFile));
zipOutputStream = new ZipOutputStream(outputStream);
zipOutputStream.setComment("通过java程序压缩的");
ZipEntry zipEntry = new ZipEntry(srcFile.getName());
zipEntry.setComment(" zipEntry通过java程序压缩的");
zipOutputStream.putNextEntry(zipEntry);
while (true) {
int readLength = inputStream.read(block);
if (readLength == -1) {
break;// end of file
}
zipOutputStream.write(block, 0, readLength);
}
zipOutputStream.flush();
zipOutputStream.finish();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException ex) {
// just ignore
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException ex) {
// just ignore
}
}
if (zipOutputStream != null) {
try {
zipOutputStream.close();
} catch (IOException ex) {
// just ignore
}
}
}
}
public static String getFilePath(File f) {
return f.getPath().replaceAll("\\\\", "/");
}
public static TreeNode getTreeFile(File f,Boolean channelEnable) {
TreeNode treeFile = new TreeNode();
treeFile.setState("open");
tree(f, treeFile,channelEnable);
return treeFile;
}
// 递归方法
private static void tree(File f, TreeNode treeFile,Boolean channelEnable) {
File[] childs = f.listFiles();
treeFile.setId(getFilePath(f));
treeFile.setChecked(false);
treeFile.setText(f.getName());
if (f.isFile()) {
treeFile.setIconCls("");
} else {
if (treeFile.getState() == null
|| treeFile.getState().length() == 0) {
treeFile.setState("closed");
}
}
if (childs == null || childs.length == 0) {
treeFile.setState("open");
return;
}
if (treeFile.getChildren() == null) {
treeFile.setChildren(new ArrayList<TreeNode>());
}
for (int i = 0; i < childs.length; i++) {
if(!channelEnable&&childs[i].getName().equals("channel"))continue;
TreeNode child = new TreeNode();
treeFile.getChildren().add(child);
tree(childs[i], child,channelEnable);
}
}
@SuppressWarnings("rawtypes")
public static void unZip(File zipf, String targetDir) throws IOException {
ZipFile zfile = new ZipFile(zipf);
Enumeration zList = zfile.entries();
ZipEntry ze = null;
byte[] buf = new byte[1024];
while (zList.hasMoreElements()) {
ze = (ZipEntry) zList.nextElement();
if (ze.isDirectory()) {
File f = new File(String.format("%s/%s", targetDir,
ze.getName()));
f.mkdir();
continue;
}
OutputStream os = new BufferedOutputStream(new FileOutputStream(
String.format("%s/%s", targetDir, ze.getName())));
InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
int readLen = 0;
while ((readLen = is.read(buf, 0, 1024)) != -1) {
os.write(buf, 0, readLen);
}
is.close();
os.close();
}
zfile.close();
}
}