Beispiel #1
0
        public virtual void  TestTwoFiles()
        {
            CreateSequenceFile(dir, "d1", (byte)0, 15);
            CreateSequenceFile(dir, "d2", (byte)0, 114);

            CompoundFileWriter csw = new CompoundFileWriter(dir, "d.csf");

            csw.AddFile("d1");
            csw.AddFile("d2");
            csw.Close();

            CompoundFileReader csr      = new CompoundFileReader(dir, "d.csf");
            IndexInput         expected = dir.OpenInput("d1");
            IndexInput         actual   = csr.OpenInput("d1");

            AssertSameStreams("d1", expected, actual);
            AssertSameSeekBehavior("d1", expected, actual);
            expected.Close();
            actual.Close();

            expected = dir.OpenInput("d2");
            actual   = csr.OpenInput("d2");
            AssertSameStreams("d2", expected, actual);
            AssertSameSeekBehavior("d2", expected, actual);
            expected.Close();
            actual.Close();
            csr.Close();
        }
Beispiel #2
0
        public virtual void  TestFileNotFound()
        {
            SetUp_2();
            CompoundFileReader cr = new CompoundFileReader(dir, "f.comp", null);

            // Open two files
            Assert.Throws <System.IO.IOException>(() => cr.OpenInput("bogus", null), "File not found");
            cr.Close();
        }
Beispiel #3
0
        public virtual void  TestClonedStreamsClosing()
        {
            SetUp_2();
            CompoundFileReader cr = new CompoundFileReader(dir, "f.comp");

            // basic clone
            IndexInput expected = dir.OpenInput("f11");

            // this test only works for FSIndexInput
            Assert.IsTrue(_TestHelper.IsSimpleFSIndexInput(expected));
            Assert.IsTrue(_TestHelper.IsSimpleFSIndexInputOpen(expected));

            IndexInput one = cr.OpenInput("f11");

            Assert.IsTrue(IsCSIndexInputOpen(one));

            IndexInput two = (IndexInput)one.Clone();

            Assert.IsTrue(IsCSIndexInputOpen(two));

            AssertSameStreams("basic clone one", expected, one);
            expected.Seek(0);
            AssertSameStreams("basic clone two", expected, two);

            // Now close the first stream
            one.Close();
            Assert.IsTrue(IsCSIndexInputOpen(one), "Only close when cr is closed");

            // The following should really fail since we couldn't expect to
            // access a file once close has been called on it (regardless of
            // buffering and/or clone magic)
            expected.Seek(0);
            two.Seek(0);
            AssertSameStreams("basic clone two/2", expected, two);


            // Now close the compound reader
            cr.Close();
            Assert.IsFalse(IsCSIndexInputOpen(one), "Now closed one");
            Assert.IsFalse(IsCSIndexInputOpen(two), "Now closed two");

            // The following may also fail since the compound stream is closed
            expected.Seek(0);
            two.Seek(0);
            //assertSameStreams("basic clone two/3", expected, two);


            // Now close the second clone
            two.Close();
            expected.Seek(0);
            two.Seek(0);
            //assertSameStreams("basic clone two/4", expected, two);

            expected.Close();
        }
Beispiel #4
0
        public virtual void  TestRandomFiles()
        {
            // Setup the test segment
            System.String segment = "test";
            int           chunk   = 1024; // internal buffer size used by the stream

            CreateRandomFile(dir, segment + ".zero", 0);
            CreateRandomFile(dir, segment + ".one", 1);
            CreateRandomFile(dir, segment + ".ten", 10);
            CreateRandomFile(dir, segment + ".hundred", 100);
            CreateRandomFile(dir, segment + ".big1", chunk);
            CreateRandomFile(dir, segment + ".big2", chunk - 1);
            CreateRandomFile(dir, segment + ".big3", chunk + 1);
            CreateRandomFile(dir, segment + ".big4", 3 * chunk);
            CreateRandomFile(dir, segment + ".big5", 3 * chunk - 1);
            CreateRandomFile(dir, segment + ".big6", 3 * chunk + 1);
            CreateRandomFile(dir, segment + ".big7", 1000 * chunk);

            // Setup extraneous files
            CreateRandomFile(dir, "onetwothree", 100);
            CreateRandomFile(dir, segment + ".notIn", 50);
            CreateRandomFile(dir, segment + ".notIn2", 51);

            // Now test
            CompoundFileWriter csw = new CompoundFileWriter(dir, "test.cfs");

            System.String[] data = new System.String[] { ".zero", ".one", ".ten", ".hundred", ".big1", ".big2", ".big3", ".big4", ".big5", ".big6", ".big7" };
            for (int i = 0; i < data.Length; i++)
            {
                csw.AddFile(segment + data[i]);
            }
            csw.Close();

            CompoundFileReader csr = new CompoundFileReader(dir, "test.cfs");

            for (int i = 0; i < data.Length; i++)
            {
                IndexInput check = dir.OpenInput(segment + data[i]);
                IndexInput test  = csr.OpenInput(segment + data[i]);
                AssertSameStreams(data[i], check, test);
                AssertSameSeekBehavior(data[i], check, test);
                test.Close();
                check.Close();
            }
            csr.Close();
        }
Beispiel #5
0
        public virtual void  TestReadPastEOF()
        {
            SetUp_2();
            CompoundFileReader cr         = new CompoundFileReader(dir, "f.comp", null);
            IndexInput         is_Renamed = cr.OpenInput("f2", null);

            is_Renamed.Seek(is_Renamed.Length(null) - 10, null);
            byte[] b = new byte[100];
            is_Renamed.ReadBytes(b, 0, 10, null);

            Assert.Throws <System.IO.IOException>(() => is_Renamed.ReadByte(null), "Single byte read past end of file");

            is_Renamed.Seek(is_Renamed.Length(null) - 10, null);
            Assert.Throws <System.IO.IOException>(() => is_Renamed.ReadBytes(b, 0, 50, null), "Block read past end of file");

            is_Renamed.Close();
            cr.Close();
        }
Beispiel #6
0
        public virtual void  TestFileNotFound()
        {
            SetUp_2();
            CompoundFileReader cr = new CompoundFileReader(dir, "f.comp");

            // Open two files
            try
            {
                IndexInput e1 = cr.OpenInput("bogus");
                Assert.Fail("File not found");
            }
            catch (System.IO.IOException e)
            {
                /* success */
                //System.out.println("SUCCESS: File Not Found: " + e);
            }

            cr.Close();
        }
Beispiel #7
0
        public virtual void  TestSingleFile()
        {
            int[] data = new int[] { 0, 1, 10, 100 };
            for (int i = 0; i < data.Length; i++)
            {
                System.String name = "t" + data[i];
                CreateSequenceFile(dir, name, (byte)0, data[i]);
                CompoundFileWriter csw = new CompoundFileWriter(dir, name + ".cfs");
                csw.AddFile(name);
                csw.Close();

                CompoundFileReader csr      = new CompoundFileReader(dir, name + ".cfs");
                IndexInput         expected = dir.OpenInput(name);
                IndexInput         actual   = csr.OpenInput(name);
                AssertSameStreams(name, expected, actual);
                AssertSameSeekBehavior(name, expected, actual);
                expected.Close();
                actual.Close();
                csr.Close();
            }
        }
Beispiel #8
0
        public virtual void  TestReadPastEOF()
        {
            SetUp_2();
            CompoundFileReader cr         = new CompoundFileReader(dir, "f.comp");
            IndexInput         is_Renamed = cr.OpenInput("f2");

            is_Renamed.Seek(is_Renamed.Length() - 10);
            byte[] b = new byte[100];
            is_Renamed.ReadBytes(b, 0, 10);

            try
            {
                byte test = is_Renamed.ReadByte();
                Assert.Fail("Single byte read past end of file");
            }
            catch (System.IO.IOException e)
            {
                /* success */
                //System.out.println("SUCCESS: single byte read past end of file: " + e);
            }

            is_Renamed.Seek(is_Renamed.Length() - 10);
            try
            {
                is_Renamed.ReadBytes(b, 0, 50);
                Assert.Fail("Block read past end of file");
            }
            catch (System.IO.IOException e)
            {
                /* success */
                //System.out.println("SUCCESS: block read past end of file: " + e);
            }

            is_Renamed.Close();
            cr.Close();
        }
Beispiel #9
0
		public static void  Main(System.String[] args)
		{
			System.String filename = null;
			bool extract = false;
			
			for (int i = 0; i < args.Length; ++i)
			{
				if (args[i].Equals("-extract"))
				{
					extract = true;
				}
				else if (filename == null)
				{
					filename = args[i];
				}
			}
			
			if (filename == null)
			{
				System.Console.Out.WriteLine("Usage: Lucene.Net.Index.IndexReader [-extract] <cfsfile>");
				return ;
			}
			
			Directory dir = null;
			CompoundFileReader cfr = null;
			
			try
			{
				System.IO.FileInfo 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.FileInfo(dirname));
				cfr = new CompoundFileReader(dir, filename);
				
				System.String[] files = cfr.List();
				System.Array.Sort(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)
					{
						System.Console.Out.WriteLine("extract " + files[i] + " with " + len + " bytes to local directory...");
						IndexInput ii = cfr.OpenInput(files[i]);
						
						System.IO.FileStream f = new System.IO.FileStream(files[i], System.IO.FileMode.Create);
						
						// read and write with a small buffer, which is more effectiv than reading byte by byte
						byte[] buffer = new byte[1024];
						int chunk = buffer.Length;
						while (len > 0)
						{
							int 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(files[i] + ": " + 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);
				}
			}
		}
Beispiel #10
0
 public virtual void  TestReadPastEOF()
 {
     SetUp_2();
     CompoundFileReader cr = new CompoundFileReader(dir, "f.comp");
     IndexInput is_Renamed = cr.OpenInput("f2");
     is_Renamed.Seek(is_Renamed.Length() - 10);
     byte[] b = new byte[100];
     is_Renamed.ReadBytes(b, 0, 10);
     
     Assert.Throws<System.IO.IOException>(() => is_Renamed.ReadByte(), "Single byte read past end of file");
     
     is_Renamed.Seek(is_Renamed.Length() - 10);
     Assert.Throws<System.IO.IOException>(() => is_Renamed.ReadBytes(b, 0, 50), "Block read past end of file");
     
     is_Renamed.Close();
     cr.Close();
 }
Beispiel #11
0
 public virtual void  TestFileNotFound()
 {
     SetUp_2();
     CompoundFileReader cr = new CompoundFileReader(dir, "f.comp");
     // Open two files
     Assert.Throws<System.IO.IOException>(() => cr.OpenInput("bogus"), "File not found");
     cr.Close();
 }
Beispiel #12
0
 public virtual void  TestRandomAccessClones()
 {
     SetUp_2();
     CompoundFileReader cr = new CompoundFileReader(dir, "f.comp");
     
     // Open two files
     IndexInput e1 = cr.OpenInput("f11");
     IndexInput e2 = cr.OpenInput("f3");
     
     IndexInput a1 = (IndexInput) e1.Clone();
     IndexInput a2 = (IndexInput) e2.Clone();
     
     // Seek the first pair
     e1.Seek(100);
     a1.Seek(100);
     Assert.AreEqual(100, e1.FilePointer);
     Assert.AreEqual(100, a1.FilePointer);
     byte be1 = e1.ReadByte();
     byte ba1 = a1.ReadByte();
     Assert.AreEqual(be1, ba1);
     
     // Now seek the second pair
     e2.Seek(1027);
     a2.Seek(1027);
     Assert.AreEqual(1027, e2.FilePointer);
     Assert.AreEqual(1027, a2.FilePointer);
     byte be2 = e2.ReadByte();
     byte ba2 = a2.ReadByte();
     Assert.AreEqual(be2, ba2);
     
     // Now make sure the first one didn't move
     Assert.AreEqual(101, e1.FilePointer);
     Assert.AreEqual(101, a1.FilePointer);
     be1 = e1.ReadByte();
     ba1 = a1.ReadByte();
     Assert.AreEqual(be1, ba1);
     
     // Now more the first one again, past the buffer length
     e1.Seek(1910);
     a1.Seek(1910);
     Assert.AreEqual(1910, e1.FilePointer);
     Assert.AreEqual(1910, a1.FilePointer);
     be1 = e1.ReadByte();
     ba1 = a1.ReadByte();
     Assert.AreEqual(be1, ba1);
     
     // Now make sure the second set didn't move
     Assert.AreEqual(1028, e2.FilePointer);
     Assert.AreEqual(1028, a2.FilePointer);
     be2 = e2.ReadByte();
     ba2 = a2.ReadByte();
     Assert.AreEqual(be2, ba2);
     
     // Move the second set back, again cross the buffer size
     e2.Seek(17);
     a2.Seek(17);
     Assert.AreEqual(17, e2.FilePointer);
     Assert.AreEqual(17, a2.FilePointer);
     be2 = e2.ReadByte();
     ba2 = a2.ReadByte();
     Assert.AreEqual(be2, ba2);
     
     // Finally, make sure the first set didn't move
     // Now make sure the first one didn't move
     Assert.AreEqual(1911, e1.FilePointer);
     Assert.AreEqual(1911, a1.FilePointer);
     be1 = e1.ReadByte();
     ba1 = a1.ReadByte();
     Assert.AreEqual(be1, ba1);
     
     e1.Close();
     e2.Close();
     a1.Close();
     a2.Close();
     cr.Close();
 }
Beispiel #13
0
 public virtual void  TestClonedStreamsClosing()
 {
     SetUp_2();
     CompoundFileReader cr = new CompoundFileReader(dir, "f.comp");
     
     // basic clone
     IndexInput expected = dir.OpenInput("f11");
     
     // this test only works for FSIndexInput
     Assert.IsTrue(_TestHelper.IsSimpleFSIndexInput(expected));
     Assert.IsTrue(_TestHelper.IsSimpleFSIndexInputOpen(expected));
     
     IndexInput one = cr.OpenInput("f11");
     Assert.IsTrue(IsCSIndexInputOpen(one));
     
     IndexInput two = (IndexInput) one.Clone();
     Assert.IsTrue(IsCSIndexInputOpen(two));
     
     AssertSameStreams("basic clone one", expected, one);
     expected.Seek(0);
     AssertSameStreams("basic clone two", expected, two);
     
     // Now close the first stream
     one.Close();
     Assert.IsTrue(IsCSIndexInputOpen(one), "Only close when cr is closed");
     
     // The following should really fail since we couldn't expect to
     // access a file once close has been called on it (regardless of
     // buffering and/or clone magic)
     expected.Seek(0);
     two.Seek(0);
     AssertSameStreams("basic clone two/2", expected, two);
     
     
     // Now close the compound reader
     cr.Close();
     Assert.IsFalse(IsCSIndexInputOpen(one), "Now closed one");
     Assert.IsFalse(IsCSIndexInputOpen(two), "Now closed two");
     
     // The following may also fail since the compound stream is closed
     expected.Seek(0);
     two.Seek(0);
     //assertSameStreams("basic clone two/3", expected, two);
     
     
     // Now close the second clone
     two.Close();
     expected.Seek(0);
     two.Seek(0);
     //assertSameStreams("basic clone two/4", expected, two);
     
     expected.Close();
 }
Beispiel #14
0
 public virtual void  TestRandomFiles()
 {
     // Setup the test segment
     System.String segment = "test";
     int chunk = 1024; // internal buffer size used by the stream
     CreateRandomFile(dir, segment + ".zero", 0);
     CreateRandomFile(dir, segment + ".one", 1);
     CreateRandomFile(dir, segment + ".ten", 10);
     CreateRandomFile(dir, segment + ".hundred", 100);
     CreateRandomFile(dir, segment + ".big1", chunk);
     CreateRandomFile(dir, segment + ".big2", chunk - 1);
     CreateRandomFile(dir, segment + ".big3", chunk + 1);
     CreateRandomFile(dir, segment + ".big4", 3 * chunk);
     CreateRandomFile(dir, segment + ".big5", 3 * chunk - 1);
     CreateRandomFile(dir, segment + ".big6", 3 * chunk + 1);
     CreateRandomFile(dir, segment + ".big7", 1000 * chunk);
     
     // Setup extraneous files
     CreateRandomFile(dir, "onetwothree", 100);
     CreateRandomFile(dir, segment + ".notIn", 50);
     CreateRandomFile(dir, segment + ".notIn2", 51);
     
     // Now test
     CompoundFileWriter csw = new CompoundFileWriter(dir, "test.cfs");
     System.String[] data = new System.String[]{".zero", ".one", ".ten", ".hundred", ".big1", ".big2", ".big3", ".big4", ".big5", ".big6", ".big7"};
     for (int i = 0; i < data.Length; i++)
     {
         csw.AddFile(segment + data[i]);
     }
     csw.Close();
     
     CompoundFileReader csr = new CompoundFileReader(dir, "test.cfs");
     for (int i = 0; i < data.Length; i++)
     {
         IndexInput check = dir.OpenInput(segment + data[i]);
         IndexInput test = csr.OpenInput(segment + data[i]);
         AssertSameStreams(data[i], check, test);
         AssertSameSeekBehavior(data[i], check, test);
         test.Close();
         check.Close();
     }
     csr.Close();
 }
Beispiel #15
0
 public virtual void  TestTwoFiles()
 {
     CreateSequenceFile(dir, "d1", (byte) 0, 15);
     CreateSequenceFile(dir, "d2", (byte) 0, 114);
     
     CompoundFileWriter csw = new CompoundFileWriter(dir, "d.csf");
     csw.AddFile("d1");
     csw.AddFile("d2");
     csw.Close();
     
     CompoundFileReader csr = new CompoundFileReader(dir, "d.csf");
     IndexInput expected = dir.OpenInput("d1");
     IndexInput actual = csr.OpenInput("d1");
     AssertSameStreams("d1", expected, actual);
     AssertSameSeekBehavior("d1", expected, actual);
     expected.Close();
     actual.Close();
     
     expected = dir.OpenInput("d2");
     actual = csr.OpenInput("d2");
     AssertSameStreams("d2", expected, actual);
     AssertSameSeekBehavior("d2", expected, actual);
     expected.Close();
     actual.Close();
     csr.Close();
 }
Beispiel #16
0
 public virtual void  TestSingleFile()
 {
     int[] data = new int[]{0, 1, 10, 100};
     for (int i = 0; i < data.Length; i++)
     {
         System.String name = "t" + data[i];
         CreateSequenceFile(dir, name, (byte) 0, data[i]);
         CompoundFileWriter csw = new CompoundFileWriter(dir, name + ".cfs");
         csw.AddFile(name);
         csw.Close();
         
         CompoundFileReader csr = new CompoundFileReader(dir, name + ".cfs");
         IndexInput expected = dir.OpenInput(name);
         IndexInput actual = csr.OpenInput(name);
         AssertSameStreams(name, expected, actual);
         AssertSameSeekBehavior(name, expected, actual);
         expected.Close();
         actual.Close();
         csr.Close();
     }
 }
		public virtual void  TestFileNotFound()
		{
			SetUp_2();
			CompoundFileReader cr = new CompoundFileReader(dir, "f.comp");
			
			// Open two files
			try
			{
				IndexInput e1 = cr.OpenInput("bogus");
				Assert.Fail("File not found");
			}
			catch (System.IO.IOException e)
			{
				/* success */
				//System.out.println("SUCCESS: File Not Found: " + e);
			}
			
			cr.Close();
		}
Beispiel #18
0
        public virtual void  TestRandomAccessClones()
        {
            SetUp_2();
            CompoundFileReader cr = new CompoundFileReader(dir, "f.comp");

            // Open two files
            IndexInput e1 = cr.OpenInput("f11");
            IndexInput e2 = cr.OpenInput("f3");

            IndexInput a1 = (IndexInput)e1.Clone();
            IndexInput a2 = (IndexInput)e2.Clone();

            // Seek the first pair
            e1.Seek(100);
            a1.Seek(100);
            Assert.AreEqual(100, e1.GetFilePointer());
            Assert.AreEqual(100, a1.GetFilePointer());
            byte be1 = e1.ReadByte();
            byte ba1 = a1.ReadByte();

            Assert.AreEqual(be1, ba1);

            // Now seek the second pair
            e2.Seek(1027);
            a2.Seek(1027);
            Assert.AreEqual(1027, e2.GetFilePointer());
            Assert.AreEqual(1027, a2.GetFilePointer());
            byte be2 = e2.ReadByte();
            byte ba2 = a2.ReadByte();

            Assert.AreEqual(be2, ba2);

            // Now make sure the first one didn't move
            Assert.AreEqual(101, e1.GetFilePointer());
            Assert.AreEqual(101, a1.GetFilePointer());
            be1 = e1.ReadByte();
            ba1 = a1.ReadByte();
            Assert.AreEqual(be1, ba1);

            // Now more the first one again, past the buffer length
            e1.Seek(1910);
            a1.Seek(1910);
            Assert.AreEqual(1910, e1.GetFilePointer());
            Assert.AreEqual(1910, a1.GetFilePointer());
            be1 = e1.ReadByte();
            ba1 = a1.ReadByte();
            Assert.AreEqual(be1, ba1);

            // Now make sure the second set didn't move
            Assert.AreEqual(1028, e2.GetFilePointer());
            Assert.AreEqual(1028, a2.GetFilePointer());
            be2 = e2.ReadByte();
            ba2 = a2.ReadByte();
            Assert.AreEqual(be2, ba2);

            // Move the second set back, again cross the buffer size
            e2.Seek(17);
            a2.Seek(17);
            Assert.AreEqual(17, e2.GetFilePointer());
            Assert.AreEqual(17, a2.GetFilePointer());
            be2 = e2.ReadByte();
            ba2 = a2.ReadByte();
            Assert.AreEqual(be2, ba2);

            // Finally, make sure the first set didn't move
            // Now make sure the first one didn't move
            Assert.AreEqual(1911, e1.GetFilePointer());
            Assert.AreEqual(1911, a1.GetFilePointer());
            be1 = e1.ReadByte();
            ba1 = a1.ReadByte();
            Assert.AreEqual(be1, ba1);

            e1.Close();
            e2.Close();
            a1.Close();
            a2.Close();
            cr.Close();
        }
		public virtual void  TestReadPastEOF()
		{
			SetUp_2();
			CompoundFileReader cr = new CompoundFileReader(dir, "f.comp");
			IndexInput is_Renamed = cr.OpenInput("f2");
			is_Renamed.Seek(is_Renamed.Length() - 10);
			byte[] b = new byte[100];
			is_Renamed.ReadBytes(b, 0, 10);
			
			try
			{
				byte test = is_Renamed.ReadByte();
				Assert.Fail("Single byte read past end of file");
			}
			catch (System.IO.IOException e)
			{
				/* success */
				//System.out.println("SUCCESS: single byte read past end of file: " + e);
			}
			
			is_Renamed.Seek(is_Renamed.Length() - 10);
			try
			{
				is_Renamed.ReadBytes(b, 0, 50);
				Assert.Fail("Block read past end of file");
			}
			catch (System.IO.IOException e)
			{
				/* success */
				//System.out.println("SUCCESS: block read past end of file: " + e);
			}
			
			is_Renamed.Close();
			cr.Close();
		}
Beispiel #20
0
        public static void  Main(System.String[] args)
        {
            System.String filename = null;
            bool          extract  = false;

            for (int i = 0; i < args.Length; ++i)
            {
                if (args[i].Equals("-extract"))
                {
                    extract = true;
                }
                else if (filename == null)
                {
                    filename = args[i];
                }
            }

            if (filename == null)
            {
                System.Console.Out.WriteLine("Usage: Lucene.Net.index.IndexReader [-extract] <cfsfile>");
                return;
            }

            Directory          dir = null;
            CompoundFileReader cfr = null;

            try
            {
                System.IO.FileInfo file    = new System.IO.FileInfo(filename);
                System.String      dirname = new System.IO.FileInfo(file.FullName).DirectoryName;
                filename = file.Name;
                dir      = FSDirectory.GetDirectory(dirname, false);
                cfr      = new CompoundFileReader(dir, filename);

                System.String[] files = cfr.List();
                System.Array.Sort(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)
                    {
                        System.Console.Out.WriteLine("extract " + files[i] + " with " + len + " bytes to local directory...");
                        IndexInput ii = cfr.OpenInput(files[i]);

                        System.IO.FileStream f = new System.IO.FileStream(files[i], System.IO.FileMode.Create);

                        // read and write with a small buffer, which is more effectiv than reading byte by byte
                        byte[] buffer = new byte[1024];
                        int    chunk  = buffer.Length;
                        while (len > 0)
                        {
                            int bufLen = (int)System.Math.Min(chunk, len);
                            ii.ReadBytes(buffer, 0, bufLen);

                            byte[] byteArray = new byte[buffer.Length];
                            for (int index = 0; index < buffer.Length; index++)
                            {
                                byteArray[index] = (byte)buffer[index];
                            }

                            f.Write(byteArray, 0, bufLen);

                            len -= bufLen;
                        }

                        f.Close();
                        ii.Close();
                    }
                    else
                    {
                        System.Console.Out.WriteLine(files[i] + ": " + 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);
                }
            }
        }