public static void Main(String[] args)
{
System.String filename = null;
bool extract = false;
foreach (string t in args)
{
if (t.Equals("-extract"))
{
extract = true;
}
else if (filename == null)
{
filename = t;
}
}
if (filename == null)
{
System.Console.Out.WriteLine("Usage: Lucene.Net.Index.IndexReader [-extract] <cfsfile>");
return ;
}
Directory dir = null;
CompoundFileReader cfr = null;
try
{
var file = new System.IO.FileInfo(filename);
System.String dirname = new System.IO.FileInfo(file.FullName).DirectoryName;
filename = file.Name;
dir = FSDirectory.Open(new System.IO.DirectoryInfo(dirname));
cfr = new CompoundFileReader(dir, filename);
System.String[] files = cfr.ListAll();
System.Array.Sort(files); // sort the array of filename so that the output is more readable
foreach (string t in files)
{
long len = cfr.FileLength(t);
if (extract)
{
System.Console.Out.WriteLine("extract " + t + " with " + len + " bytes to local directory...");
IndexInput ii = cfr.OpenInput(t);
var f = new System.IO.FileStream(t, System.IO.FileMode.Create);
// read and write with a small buffer, which is more effectiv than reading byte by byte
var buffer = new byte[1024];
int chunk = buffer.Length;
while (len > 0)
{
var bufLen = (int) System.Math.Min(chunk, len);
ii.ReadBytes(buffer, 0, bufLen);
f.Write(buffer, 0, bufLen);
len -= bufLen;
}
f.Close();
ii.Close();
}
else
System.Console.Out.WriteLine(t + ": " + len + " bytes");
}
}
catch (System.IO.IOException ioe)
{
System.Console.Error.WriteLine(ioe.StackTrace);
}
finally
{
try
{
if (dir != null)
dir.Close();
if (cfr != null)
cfr.Close();
}
catch (System.IO.IOException ioe)
{
System.Console.Error.WriteLine(ioe.StackTrace);
}
}
}