mirror of
https://github.com/topjohnwu/jtar.git
synced 2025-02-17 01:29:04 +00:00
Merge pull request #5 from cavorite/master
Create TarEntry objects without requiring File objects
This commit is contained in:
commit
e777252273
@ -44,6 +44,22 @@ public class TarEntry {
|
||||
this.parseTarHeader(headerBuf);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor to create an entry from an existing TarHeader object.
|
||||
*
|
||||
* This method is useful to add new entries programmatically (e.g. for
|
||||
* adding files or directories that do not exist in the file system).
|
||||
*
|
||||
* @param header
|
||||
*
|
||||
* @see TarHeader#createFileHeader(String, long, long)
|
||||
* @see TarHeader#createDirHeader(String, long)
|
||||
*/
|
||||
public TarEntry(TarHeader header) {
|
||||
this.file = null;
|
||||
this.header = header;
|
||||
}
|
||||
|
||||
public boolean equals(TarEntry it) {
|
||||
return this.header.name.toString().equals(it.header.name.toString());
|
||||
}
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
package org.kamranzafar.jtar;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Header
|
||||
*
|
||||
@ -194,4 +196,78 @@ public class TarHeader {
|
||||
return offset + length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new header for a file entry.
|
||||
*
|
||||
* This method is useful for creating entries that do not correspond to a
|
||||
* file.
|
||||
*
|
||||
* @param fileName File name
|
||||
* @param fileSize File size in bytes
|
||||
* @param modTime Last modification time in numeric Unix time format
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static TarHeader createFileHeader(String fileName, long fileSize, long modTime) {
|
||||
String name = fileName;
|
||||
TarHeader header = new TarHeader();
|
||||
name = name.replace(File.separatorChar, '/');
|
||||
|
||||
if (name.startsWith("/"))
|
||||
name = name.substring(1);
|
||||
|
||||
header.linkName = new StringBuffer("");
|
||||
|
||||
header.name = new StringBuffer(name);
|
||||
|
||||
header.mode = 0100644;
|
||||
header.linkFlag = TarHeader.LF_NORMAL;
|
||||
header.size = fileSize;
|
||||
|
||||
header.modTime = modTime;
|
||||
header.checkSum = 0;
|
||||
header.devMajor = 0;
|
||||
header.devMinor = 0;
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new header for a directory entry.
|
||||
*
|
||||
* This method is useful for creating entries that do not correspond to
|
||||
* a directory in the file system.
|
||||
*
|
||||
* @param fileName Directory name
|
||||
* @param modTime Last modification time in numeric Unix time format
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static TarHeader createDirHeader(String dirName, long modTime) {
|
||||
String name = dirName;
|
||||
TarHeader header = new TarHeader();
|
||||
name = name.replace(File.separatorChar, '/');
|
||||
|
||||
if (name.startsWith("/"))
|
||||
name = name.substring(1);
|
||||
|
||||
header.linkName = new StringBuffer("");
|
||||
|
||||
header.name = new StringBuffer(name);
|
||||
|
||||
header.mode = 040755;
|
||||
header.linkFlag = TarHeader.LF_DIR;
|
||||
if (header.name.charAt(header.name.length() - 1) != '/') {
|
||||
header.name.append("/");
|
||||
}
|
||||
header.size = 0;
|
||||
|
||||
header.modTime = modTime;
|
||||
header.checkSum = 0;
|
||||
header.devMajor = 0;
|
||||
header.devMinor = 0;
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
}
|
@ -28,6 +28,7 @@ import java.util.zip.GZIPInputStream;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.JUnit4;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
@RunWith(JUnit4.class)
|
||||
public class JTarTest {
|
||||
@ -183,4 +184,29 @@ public class JTarTest {
|
||||
origin.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fileEntry() throws IOException {
|
||||
|
||||
String fileName = "file.txt";
|
||||
long fileSize = 14523;
|
||||
long modTime = System.currentTimeMillis() / 1000;
|
||||
|
||||
// Create a header object and check the fields
|
||||
TarHeader fileHeader = TarHeader.createFileHeader(fileName, fileSize, modTime);
|
||||
assertEquals(fileName, fileHeader.name.toString());
|
||||
assertEquals(TarHeader.LF_NORMAL, fileHeader.linkFlag);
|
||||
assertEquals(fileSize, fileHeader.size);
|
||||
assertEquals(modTime, fileHeader.modTime);
|
||||
|
||||
// Create an entry from the header
|
||||
TarEntry fileEntry = new TarEntry(fileHeader);
|
||||
assertEquals(fileName, fileEntry.getName());
|
||||
|
||||
// Write the header into a buffer, create it back and compare them
|
||||
byte[] headerBuf = new byte[TarConstants.HEADER_BLOCK];
|
||||
fileEntry.writeEntryHeader( headerBuf );
|
||||
TarEntry createdEntry = new TarEntry(headerBuf);
|
||||
assertTrue(fileEntry.equals(createdEntry));
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user