zip files portability on win and mac



Hi,

I'm currently developing an application which, among other things,
should zip some folders with all their content (therefore, also
subfolders).
Browsing I found and slightly adapted the following code:

public class ZipUtil {
private ZipOutputStream cpZipOutputStream = null;
private String strSource = "";
private String strTarget = "";
private String strSubstring = "";

public void ZipDirectory (String dir2zip, String destFile){
strSource = dir2zip;
strTarget = destFile;
zip();
}

private void zip(){
try{
File cpFile = new File (strSource);
if (!cpFile.isFile() && !cpFile.isDirectory() ) {
System.out.println("\nSource file/directory Not Found!");
return;
}
if (cpFile.isDirectory()) {
strSubstring = strSource;
} else {
strSubstring = "";
}
FileOutputStream fos = new FileOutputStream(strTarget);
cpZipOutputStream = new ZipOutputStream(fos);
cpZipOutputStream.setLevel(9);
zipFiles(cpFile);
cpZipOutputStream.finish();
cpZipOutputStream.close();
fos.close();
}catch (Exception e){
e.printStackTrace();
}
}

private void zipFiles(File cpFile) {
if (cpFile.isDirectory()) {
File [] fList = cpFile.listFiles() ;
for (int i=0; i< fList.length; i++){
zipFiles(fList[i]) ;
}
} else {
try {
String strAbsPath = cpFile.getAbsolutePath();
String strZipEntryName ="";
if (!strSubstring.equals("") ){

strZipEntryName = strAbsPath.substring(
strSource.length()+1, strAbsPath.length());

} else {
strZipEntryName = cpFile.getName();
}
byte[] b = new byte[ (int)(cpFile.length()) ];
FileInputStream cpFileInputStream =
new FileInputStream (cpFile) ;
cpFileInputStream.read(b, 0, (int)cpFile.length());
ZipEntry cpZipEntry = new ZipEntry(strZipEntryName);
cpZipOutputStream.putNextEntry(cpZipEntry );
cpZipOutputStream.write(b, 0, (int)cpFile.length());
cpZipOutputStream.closeEntry() ;
cpFileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

The problem is that when I run this on Windows, the following line:

strZipEntryName = strAbsPath.substring(strSource.length()+1,
strAbsPath.length());

uses the backslash as File.separator. So the zip file contains all the
folders and subfolders when I extract the zip file on Windows.
On the other hand, if I try to extract on a Mac, it will consider the
backslash as part of the filename.

e.g.
folder\foo.bar

On Windows it's a folder with a foo.bar file inside.
On Mac, it is a file named "folder\foo".

Am I wrong somewhere, or is there any workaround for this problem?
I'd like my zip files to be as portable as my application :)

Thanks in advance for your answer!

gianpi

.



Relevant Pages

  • Re: folder maxes
    ... As to the "how many subfolders" question, the answer is that it depends on ... Since a folder is treated by the file system as "just another ... the only practical limit on the number of folders is the size of your ... Microsoft Windows MVP ...
    (microsoft.public.win2000.file_system)
  • How they Microsoft arrange folders in their operating systems
    ... I got confused every time I open folders like Programs or WINDOWS in any ... So many subfolders contained therein. ...
    (microsoft.public.windowsxp.basics)
  • Re: Applying folder views to some sub folders only.
    ... I'm not aware of any way to do that natively in Windows. ... But what I would prefer is to apply the view to only the folders "below". ... folders within set the same to thumbnails. ... I want to be able to set My Pictures and all subfolders within to ...
    (microsoft.public.windowsxp.general)
  • Re: How they Microsoft arrange folders in their operating systems
    ... > I got confused every time I open folders like Programs or WINDOWS in any ... > windows operating system. ... So many subfolders contained therein. ...
    (microsoft.public.windowsxp.basics)
  • Re: Option compact all folders fails and loses contents of folder
    ... > I've used 'compact all folders' many times without incident. ... Turn off email scanning in your antivirus software. ... Windows 2000 and Windows XP. ... Windows XP Service Pack 2 Resources for IT Professionals ...
    (microsoft.public.windows.inetexplorer.ie6_outlookexpress)