* Read all files from tar archive
* No reload functionality implemented yet0.6.0-stable
parent
9590e671e6
commit
f26eeab3d4
|
@ -56,9 +56,13 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
|||
// Just test for now by reading first file
|
||||
string filePath = "ERROR";
|
||||
|
||||
byte[] data = archive.Read(out filePath);
|
||||
byte[] data;
|
||||
while ((data = archive.ReadEntry(out filePath)) != null)
|
||||
{
|
||||
m_log.DebugFormat("[ARCHIVER]: Successfully read {0} ({1} bytes) from archive {2}", filePath, data.Length, m_loadPath);
|
||||
}
|
||||
|
||||
m_log.DebugFormat("[ARCHIVER]: Successfully read {0} ({1} bytes) from archive {2}", filePath, data.Length, m_loadPath);
|
||||
m_log.DebugFormat("[ARCHIVER]: Reached end of archive");
|
||||
|
||||
archive.Close();
|
||||
}
|
||||
|
|
|
@ -27,8 +27,8 @@
|
|||
|
||||
using System;
|
||||
using System.IO;
|
||||
//using System.Reflection;
|
||||
//using log4net;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
|
||||
namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
{
|
||||
|
@ -37,9 +37,9 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
|||
/// </summary>
|
||||
public class TarArchiveReader
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected static System.Text.ASCIIEncoding m_asciiEncoding = new System.Text.ASCIIEncoding();
|
||||
protected static System.Text.ASCIIEncoding m_asciiEncoding = new System.Text.ASCIIEncoding();
|
||||
|
||||
/// <summary>
|
||||
/// Binary reader for the underlying stream
|
||||
|
@ -51,19 +51,59 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
|||
m_br = new BinaryReader(new FileStream(archivePath, FileMode.Open));
|
||||
}
|
||||
|
||||
public byte[] Read(out string filePath)
|
||||
/// <summary>
|
||||
/// Are we at the end of the archive?
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool AtEof()
|
||||
{
|
||||
TarHeader header = ReadHeader();
|
||||
// If we've reached the end of the archive we'll be in null block territory, which means
|
||||
// the next byte will be 0
|
||||
if (m_br.PeekChar() == 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Read the next entry in the tar file.
|
||||
/// </summary>
|
||||
/// <param name="filePath"></param>
|
||||
/// <returns>the data for the entry. Returns null if there are no more entries</returns>
|
||||
public byte[] ReadEntry(out string filePath)
|
||||
{
|
||||
filePath = String.Empty;
|
||||
|
||||
if (AtEof())
|
||||
return null;
|
||||
|
||||
TarHeader header = ReadHeader();
|
||||
|
||||
filePath = header.FilePath;
|
||||
return m_br.ReadBytes(header.FileSize);
|
||||
byte[] data = m_br.ReadBytes(header.FileSize);
|
||||
|
||||
m_log.DebugFormat("[TAR ARCHIVE READER]: filePath {0}, fileSize {1}", filePath, header.FileSize);
|
||||
|
||||
// Read the rest of the empty padding in the 512 byte block
|
||||
if (header.FileSize % 512 != 0)
|
||||
{
|
||||
int paddingLeft = 512 - (header.FileSize % 512);
|
||||
|
||||
m_log.DebugFormat("[TAR ARCHIVE READER]: Reading {0} padding bytes", paddingLeft);
|
||||
|
||||
m_br.ReadBytes(paddingLeft);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Read the next 512 byte chunk of data as a tar header.
|
||||
/// This method assumes we are not at the end of the archive
|
||||
/// </summary>
|
||||
/// <returns>A tar header struct</returns>
|
||||
/// <returns>A tar header struct.</returns>
|
||||
protected TarHeader ReadHeader()
|
||||
{
|
||||
{
|
||||
TarHeader tarHeader = new TarHeader();
|
||||
|
||||
byte[] header = m_br.ReadBytes(512);
|
||||
|
|
Loading…
Reference in New Issue