[ 
https://issues.apache.org/jira/browse/SANDBOX-168?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12661583#action_12661583
 ] 

cgrobmeier edited comment on SANDBOX-168 at 1/8/09 12:15 AM:
----------------------------------------------------------------------

I am not sure if obsolete with new trunk (I was yesterday :-)).
However, the trunk with the patch provided in 
https://issues.apache.org/jira/browse/SANDBOX-273 should fix all problems 
described here.

After 273 is fixed, this one can be closed too.

      was (Author: cgrobmeier):
    I agree, obsolete with new trunk
  
> TAR extraction fails with FileNotFoundException (directories not being 
> created)
> -------------------------------------------------------------------------------
>
>                 Key: SANDBOX-168
>                 URL: https://issues.apache.org/jira/browse/SANDBOX-168
>             Project: Commons Sandbox
>          Issue Type: Bug
>          Components: Compress
>    Affects Versions: Nightly Builds
>         Environment: Probably irrelevant, but am using JDK 1.5.0_07 on a win 
> xp sp2 box.
>            Reporter: Sam Smith
>
> --------------------------------------------------
> Summary
> --------------------------------------------------
> I am able to create TAR archive files using the org.apache.commons.compress 
> code, however, when I go to extract the contents of TAR archive using that 
> same code, it fails.
> I think that there must be a bug with org.apache.commons.compress because can 
> use the program 7-zip to successfully extract the contents of the archive.
> --------------------------------------------------
> Background
> --------------------------------------------------
> I need Java TAR support for archiving purposes; see this forum thread if you 
> want to know why:
>       http://forum.java.sun.com/thread.jspa?threadID=757876
> The com.ice.tar library
>       http://www.gjt.org/pkgdoc/com/ice/tar/index.html
> proved inadequate because it does not support long paths reliably (the GNU 
> TAR extensions are essential).
> So, I am turning to this apache code, which does handle long paths and seems 
> to be actively maintained.
> --------------------------------------------------
> Details of how the TAR archive was created
> --------------------------------------------------
> Because there appears to be no stable release for the 
> org.apache.commons.compress code, I just grabbed the latest nightly build, 
> commons-compress-20060814.  MAYBE THIS IS THE PROBLEM: if this is a known bad 
> build and there is a better one, by all means please let me know and what 
> build to use.  Also, somehow this info should be put as a comment for each 
> nightly build.
> Assuming that the above is not the case, and that this is a new bug, here is 
> how I stumbled across it.
> First, I construct a new TAR archive with code that ultimately boils down to 
> this:
>               String path = fileParent.getRelativePath(file); // Note: 
> getRelativePath will ensure that directories end with a separator
>               if (File.separatorChar != '/') path = 
> path.replace(File.separatorChar, '/');    // CRITICAL: handles bizarre 
> systems like windoze which use other chars than / for directory separation; 
> the TAR format requires / to be used
>               
>               TarEntry entry = new TarEntry( file );
>               entry.setName( path );
>               out.putNextEntry( entry );
>               writeFileData(file, out);
>               out.closeEntry();
>               
>               if ( file.isDirectory() ) {
>                       for (File fileChild : DirUtil.getContents(file, null)) 
> {        // supply null, since we test at beginning of this method (supplying 
> filter here which just add a redundant test)
>                               archive( fileChild, fileParent, out, filter );
>                       }
>               }
> Note that FileParent is my own class that I originally wrote for a ZIP 
> archiver.  This class keeps track of the root directory that is being TARed 
> because I want all of my paths to be stored as relative offsets from this 
> root; I do NOT want any path elements above that root directory to be 
> included.  The apache TarEntry class appears to me to include a lot of 
> extraneous path elements (albeit it will strip off drive letters or an 
> initial '/' char).
> In addition to controlling the paths, I also need to use low level classes 
> like TarOutputStream to force the use of GNU long paths via a call like
>       tarOutputStream.setLongFileMode(TarOutputStream.LONGFILE_GNU);
> If I were to use the high level Archiver functionality that you document here
>       http://wiki.apache.org/jakarta-commons/Compress
> (for ZIPs) or
>       
> http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/examples/org/apache/commons/compress/examples/TarExample.java?view=markup
> (for TARs), then I would have no such control over relative paths or GNU TAR 
> extensions.  There is also an efficient file filtering technique that I do 
> that would not be supported if used an Archiver.
> --------------------------------------------------
> Error when extracting the TAR archive with org.apache.commons.compress
> --------------------------------------------------
> I think that the archive produced by the above code is legitimate, because I 
> can successfully extract it using the program 7-zip.  As proof, I have a 
> program called DirectoryComparer which compares 2 directories, notes any 
> paths which are not in common, and for common paths examines every normal 
> file byte-for-byte to find any discrepancies.  Running that program on the 
> original directory and the archived/extracted one found zero differences.
> But, when I tried extracting the archive using the 
> org.apache.commons.compress code, I got the following error:
> Exception in thread "main" org.apache.commons.compress.UnpackException: 
> Exception while unpacking.
>         at 
> org.apache.commons.compress.archivers.tar.TarArchive.doUnpack(TarArchive.java:110)
>         at 
> org.apache.commons.compress.AbstractArchive.unpack(AbstractArchive.java:122)
>         at bb.io.TarUtil.extract(TarUtil.java:558)
>         at 
> bb.io.TarUtil$Test.test_archive_extract_pathLengthLimit(TarUtil.java:725)
>         at bb.io.TarUtil$Test.main(TarUtil.java:598)
> Caused by: java.io.FileNotFoundException: F:\longPaths\2B6vLVrp4c (The system 
> cannot find the path specified)
>         at java.io.FileOutputStream.open(Native Method)
>         at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
>         at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
>         at 
> org.apache.commons.compress.archivers.tar.TarArchive.doUnpack(TarArchive.java:97)
>         ... 4 more
> --------------------------------------------------
> Details of how the TAR archive was extracted
> --------------------------------------------------
> The code that I used to do the extraction is
>               TarArchive archive = null;
>               try {
>                       Archive archiver = ArchiverFactory.getInstance(tarFile);
>                       archiver.unpack(directoryToExtractInto);
>               }
>               finally {
>                       close(archive);
>               }
> Here, unlike archiving, I went ahead and used the convenient Archiver 
> functionality because no low level control was needed.
> Also, the original target directory being archived is named longPaths and, as 
> its name indicates, it has all kinds of super long path elements inside it.  
> (I wrote a program to auto generate really long subdirectory structures like 
> this for torture testing my archiving programs.)
> --------------------------------------------------
> Where the bug lies
> --------------------------------------------------
> I THINK THAT THE PROBLEM WITH THE ORG.APACHE.COMMONS.COMPRESS EXTRACTION CODE 
> IS THE FACT THAT IT EXTRACTS DIRECTORIES AS NORMAL FILES.
> I say this because there is a normal file left on my filesystem after doing 
> the above that is named longPaths.  But longPaths should be a directory; 
> since it was actually miscreated by the apache code as a file, then of course 
> the subdirectory
>       longPaths\2B6vLVrp4c
> cannot be created as reported by the stacktrace above.
> Again, let me mention that 7-zip did sucessfully completely extract the 
> complicated contents of longPaths, correctly recreating all of the 
> subdirectories etc, so I do not suspect that my code for creating the TAR 
> archive is wrong.
> Furthermore, when I tried abandoning the above TAR creation code and used 
> your Archiver technique with code like
>       Archive archiver = ArchiverFactory.getInstance("tar");
>       for (File file : files) {
>               archive(file, archiver, filter);
>       }
>       archiver.save(tarFile);
>               // this is the relevant code snippet from the archive method:
>       archiver.add( file );
>       
>       if ( file.isDirectory() ) {
>               for (File fileChild : DirUtil.getContents(file, null)) {
>                       archive( fileChild, archiver, filter );
>               }
>       }
> then I still get an error:
> Exception in thread "main" java.io.FileNotFoundException: Z:\longPaths 
> (Access is denied)
>         at java.io.FileInputStream.open(Native Method)
>         at java.io.FileInputStream.<init>(FileInputStream.java:106)
>         at 
> org.apache.commons.compress.AbstractArchive.add(AbstractArchive.java:90)
>         at bb.io.TarUtil.archive(TarUtil.java:412)
>         at bb.io.TarUtil.archive(TarUtil.java:339)
>         at 
> bb.io.TarUtil$Test.test_archive_extract_pathLengthLimit(TarUtil.java:711)
>         at bb.io.TarUtil$Test.main(TarUtil.java:594)
> --------------------------------------------------
> Misc issues
> --------------------------------------------------
> 1) I am sorry if this is a known issue that has been beaten to death on the 
> mailing list.  But I am a newcomer, and I was unable to figure out how to 
> search the mailing list archives!
> Clicking on the "Search the mailing list archive" link on
>       http://jakarta.apache.org/commons/sandbox/compress/issue-tracking.html
> brought me to
>       http://mail-archives.apache.org/mod_mbox/jakarta-commons-dev/
> which only seems to offer manual browsing, which is a tedious and inefficient 
> way to find issues with the compress code, especially as the mailing list 
> seems to discuss every commons project.
> Is there a better way?
> 2) there seem to be redundant TAR packages:
>       older one?:
>               
> http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/tar/
>       newer one?:
>               
> http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/archivers/tar/
> Which one am I supposed to use?
> 3) GNU tar apparently supports unlimited path lengths, but what about file 
> sizes?  Traditional TAR only support files up to 8 GB in size.  Does the 
> org.apache.commons.compress TAR code have any file size limits?  Please add 
> documentation about this.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to