Java 不会删除文件。我确保它具有权限(每个人都可以完全控制,或者 Unix-ers 是 777。) System.out.println(currArchive.delete()) 总是返回 false。有谁知道为什么?我尝试用 try-catch 安全异常包装它,但它没有被抛出。帮助?我确保我所有的流都关闭了,但它仍然返回错误!
这是我的代码:
TarGzipManagerView.java 的 addFile 方法
private void addInside(java.awt.event.ActionEvent evt) {
if (isCurrArchived == EXTRACTING){
final ActionEvent acevt = evt;
JFileChooser jfc = new JFileChooser();
jfc.setDialogType(JFileChooser.OPEN_DIALOG);
jfc.setMultiSelectionEnabled(true);
jfc.setAcceptAllFileFilterUsed(true);
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
jfc.setDialogTitle("Choose files to add:");
int result = jfc.showOpenDialog(theframe);
if (result == JFileChooser.APPROVE_OPTION){
File[] addsf = jfc.getSelectedFiles();
totalNewFilesToAdd = new ArrayList<File>();
ArrayList<File> newFilesToAdd = new ArrayList<File>();
ArrayList<AbsRelFile> dirEntries = new ArrayList<AbsRelFile>();
InputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(currArchive));
} catch (FileNotFoundException fnfe){
return;
}
currAStream = null;
currCStream = null;
CompressorStreamFactory cFactory = new CompressorStreamFactory();
try {
CompressorInputStream temp = cFactory.createCompressorInputStream(in);
currCStream = temp.getName();
in = new BufferedInputStream(temp);
} catch (CompressorException ex) {
//if it isn't compressed, do nothing!
}
ArchiveStreamFactory aFactory = new ArchiveStreamFactory();
realIn = null;
useZipFile = false;
try {
realIn = aFactory.createArchiveInputStream(in);
currAStream = realIn.getArchiveName();
if (currAStream.equalsIgnoreCase(ArchiveStreamFactory.ZIP)){
useZipFile = true;
try {
realIn.close();
} catch (IOException ioe){
ioe.printStackTrace();
}
}
} catch (ArchiveException ae){
//Bad Archive! oops!
new ErrorDialog(theframe, false).setVisible(true);
try {
in.close();
} catch (IOException ioe){
ioe.printStackTrace();
}
return;
}
bytesToWrite = 0;
if (!useZipFile){
ArchiveEntry ae;
try {
while ((ae = realIn.getNextEntry()) != null){
bytesToWrite += ae.getSize();
}
} catch (IOException ioe){
ioe.printStackTrace();
}
try {
realIn.close();
} catch (IOException ioe){
ioe.printStackTrace();
}
} else {
ZipArchiveEntry ae;
try {
ZipFile zf = new ZipFile(currArchive);
Enumeration en = zf.getEntriesEnum();
while (en.hasMoreElements()){
ae = (ZipArchiveEntry) en.nextElement();
bytesToWrite += ae.getSize();
}
zf.close();
} catch (IOException ioe){
ioe.printStackTrace();
}
}
try {
in = new BufferedInputStream(new FileInputStream(currArchive));
} catch (FileNotFoundException fnfe){
return;
}
currAStream = null;
currCStream = null;
cFactory = new CompressorStreamFactory();
try {
CompressorInputStream temp = cFactory.createCompressorInputStream(in);
currCStream = temp.getName();
in = new BufferedInputStream(temp);
} catch (CompressorException ex) {
//if it isn't compressed, do nothing!
}
aFactory = new ArchiveStreamFactory();
realIn = null;
useZipFile = false;
try {
realIn = aFactory.createArchiveInputStream(in);
currAStream = realIn.getArchiveName();
if (currAStream.equalsIgnoreCase(ArchiveStreamFactory.ZIP)){
useZipFile = true;
try {
realIn.close();
} catch (IOException ioe){
ioe.printStackTrace();
}
}
} catch (ArchiveException ae){
//Bad Archive! oops!
new ErrorDialog(theframe, false).setVisible(true);
try {
in.close();
} catch (IOException ioe){
ioe.printStackTrace();
}
return;
}
for (int i = 0;i<addsf.length;i++){
if (addsf[i].isFile()){
newFilesToAdd.add(addsf[i]);
totalNewFilesToAdd.add(addsf[i]);
}
if (addsf[i].isDirectory()){
dirEntries.addAll(recurseDir(addsf[i]));
totalNewFilesToAdd.addAll(recurseDir(addsf[i]));
}
}
for (int i = 0;i<totalNewFilesToAdd.size();i++){
bytesToWrite += totalNewFilesToAdd.get(i).length();
}
aentries = new ArchiveEntry[totalNewFilesToAdd.size()];
for (int i = 0;i<newFilesToAdd.size();i++){
try {
aentries[i] = new ArchiveStreamFactory().createArchiveEntry(currAStream, newFilesToAdd.get(i), newFilesToAdd.get(i).getName());
} catch (ArchiveException ae){
ae.printStackTrace();
}
}
for (int i = newFilesToAdd.size();i<totalNewFilesToAdd.size();i++){
try {
aentries[i] = new ArchiveStreamFactory().createArchiveEntry(currAStream, dirEntries.get(i-newFilesToAdd.size()), dirEntries.get(i-newFilesToAdd.size()).getRelativePath());
} catch (ArchiveException ae){
ae.printStackTrace();
}
}
Thread iothread = new Thread(new Runnable(){
public void run(){
if (!useZipFile){
try {
EventQueue.invokeLater(new Runnable(){
public void run(){
addingBox = new AddingBox(theframe, false);
}
});
File outfile = File.createTempFile("ScruffArchiveManager", null);
ArchiveOutputStream tempout = null;
CompressorOutputStream tempcomp = null;
if (currCStream == null) tempout = new ArchiveStreamFactory().createArchiveOutputStream(currAStream ,new BufferedOutputStream(new FileOutputStream(outfile)));
else {
tempcomp = new CompressorStreamFactory().createCompressorOutputStream(currCStream, new BufferedOutputStream(new FileOutputStream(outfile)));
tempout = new ArchiveStreamFactory().createArchiveOutputStream(currAStream, tempcomp);
}
if (currAStream.equals(ArchiveStreamFactory.TAR)){
TarArchiveOutputStream t = (TarArchiveOutputStream)tempout;
t.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
tempout = t;
}
ArchiveEntry ae;
long bytesWritten = 0;
while ((ae = realIn.getNextEntry()) != null){
long semiBytesWritten = 0;
tempout.putArchiveEntry(ae);
byte[] buffer = new byte[8024];
int n = 0;
if (ae.getSize() < semiBytesWritten + 8024) buffer = new byte[(int)(ae.getSize()-semiBytesWritten)];
while (semiBytesWritten < ae.getSize() && -1 != (n = realIn.read(buffer))){
tempout.write(buffer, 0, n);
semiBytesWritten += n;
bytesWritten += n;
final long k = bytesWritten;
EventQueue.invokeLater(new Runnable(){
public void run(){
addingBox.progressListener(new Progress(k, bytesToWrite));
}
});
if (ae.getSize() < semiBytesWritten + 8024) buffer = new byte[(int)(ae.getSize()-semiBytesWritten)];
}
tempout.closeArchiveEntry();
}
realIn.close();
for (int i = 0;i<aentries.length;i++){
InputStream in = new BufferedInputStream(new FileInputStream(aentries[i].getFile()));
tempout.putArchiveEntry(aentries[i]);
int n = 0;
byte[] buffer = new byte[8024];
while (-1 != (n = in.read(buffer))){
tempout.write(buffer, 0, n);
bytesWritten += n;
final long k = bytesWritten;
EventQueue.invokeLater(new Runnable(){
public void run(){
addingBox.progressListener(new Progress(k, bytesToWrite));
}
});
}
in.close();
tempout.closeArchiveEntry();
}
tempout.close();
final File ne = new File(currArchive.getAbsolutePath());
System.out.println(currArchive.delete());
outfile.renameTo(ne);
EventQueue.invokeLater(new Runnable(){
public void run(){
closeArchive(acevt);
openArchive(ne);
addingBox.progressListener(new Progress(bytesToWrite, bytesToWrite));
}
});
} catch (CompressorException ce){
ce.printStackTrace();
} catch (ArchiveException ae){
ae.printStackTrace();
} catch (IOException ioe){
ioe.printStackTrace();
}
}
}
});
iothread.start();
}
}
}