public static void Main(string[] args) { string filename = null; bool extract = false; string dirImpl = null; int j = 0; while (j < args.Length) { string arg = args[j]; if ("-extract".Equals(arg)) { extract = true; } else if ("-dir-impl".Equals(arg)) { if (j == args.Length - 1) { Console.WriteLine("ERROR: missing value for -dir-impl option"); Environment.Exit(1); } j++; dirImpl = args[j]; } else if (filename == null) { filename = arg; } j++; } if (filename == null) { Console.WriteLine("Usage: org.apache.lucene.index.CompoundFileExtractor [-extract] [-dir-impl X] <cfsfile>"); return; } Store.Directory dir = null; CompoundFileDirectory cfr = null; IOContext context = IOContext.READ; try { FileInfo file = new FileInfo(filename); string dirname = file.DirectoryName; filename = file.Name; if (dirImpl == null) { dir = FSDirectory.Open(new DirectoryInfo(dirname)); } else { dir = CommandLineUtil.NewFSDirectory(dirImpl, new DirectoryInfo(dirname)); } cfr = new CompoundFileDirectory(dir, filename, IOContext.DEFAULT, false); string[] files = cfr.ListAll(); ArrayUtil.TimSort(files); // sort the array of filename so that the output is more readable for (int i = 0; i < files.Length; ++i) { long len = cfr.FileLength(files[i]); if (extract) { Console.WriteLine("extract " + files[i] + " with " + len + " bytes to local directory..."); using (IndexInput ii = cfr.OpenInput(files[i], context)) { using (FileStream f = new FileStream(files[i], FileMode.Open, FileAccess.ReadWrite)) { // read and write with a small buffer, which is more effective than reading byte by byte byte[] buffer = new byte[1024]; int chunk = buffer.Length; while (len > 0) { int bufLen = (int)Math.Min(chunk, len); ii.ReadBytes(buffer, 0, bufLen); f.Write(buffer, 0, bufLen); len -= bufLen; } } } } else { Console.WriteLine(files[i] + ": " + len + " bytes"); } } } catch (IOException ioe) { Console.WriteLine(ioe.ToString()); Console.Write(ioe.StackTrace); } finally { try { if (dir != null) { dir.Dispose(); } if (cfr != null) { cfr.Dispose(); } } catch (IOException ioe) { Console.WriteLine(ioe.ToString()); Console.Write(ioe.StackTrace); } } }