Beispiel #1
0
        public Stream GetFileStream(int tag, int level, int x, int y)
        {
            entry = new DirectoryEntry(tag, level, x, y, 0, 0);

            UInt32 index = entry.ComputeHash() % (UInt32)(header.HashBuckets);

            long hep = GetHashEntryPosition(index);

            DirectoryEntry de;

            while (hep != 0)
            {
                de = GetDirectoryEntry(hep);

                if ((de.x == x) && (de.y == y) && ((de.tag == tag) || (tag == -1)) && (de.level == level))
                {
                    return(StreamSlice.Create(dataStream, de.location, de.size));
                }
                else
                {
                    hep = de.NextEntryInChain;
                }
            }

            return(null);
        }
Beispiel #2
0
        public Stream GetFileStream(int tag, int level, int x, int y)
        {
            entry = new DirectoryEntry(tag, level, x, y, 0, 0);

            UInt32 index = entry.ComputeHash() % (UInt32)(header.HashBuckets);

            long hep = GetHashEntryPosition(index);

            DirectoryEntry de;


            while (hep != 0)
            {
                de = GetDirectoryEntry(hep);

                if ((de.x == x) && (de.y == y) && ((de.tag == tag) || (tag == -1)) && (de.level == level))
                {
                    MemoryStream ms = null;

                    byte[] buffer = new byte[de.size];
                    dataStream.Seek(de.location, SeekOrigin.Begin);
                    dataStream.Read(buffer, 0, (int)de.size);
                    ms = new MemoryStream(buffer);
                    return(ms);
                }
                else
                {
                    hep = de.NextEntryInChain;
                }
            }
            return(null);
        }
Beispiel #3
0
        public void AddFile(string inputFilename, int tag, int level, int x, int y)
        {
            FileInfo fi = new FileInfo(inputFilename);
            if (fi.Exists)
            {
                Byte[] entryData = null;

                // Check for empty directory and add new Directory Block
                if (header.FreeEntries == 0)
                {
                    // Write Directory Header Block
                    entry = new DirectoryEntry();
                    entry.size = 8192 * (uint)Marshal.SizeOf(entry);
                    entry.NextEntryInChain = header.FirstDirectoryEntry;
                    entryData = GetEntryBytes();
                    header.FirstDirectoryEntry = fileStream.Seek(0, SeekOrigin.End);
                    fileStream.Write(entryData, 0, entryData.Length);

                    // Allocate a new 8k entries
                    header.FreeEntries = 8192;
                    header.NextFreeDirectoryEntry = fileStream.Seek(0, SeekOrigin.End);
                    fileStream.Seek(8192 * Marshal.SizeOf(entry), SeekOrigin.End);
                    fileStream.WriteByte(42);
                }


                long position = fileStream.Seek(0, SeekOrigin.End);
                entry = new DirectoryEntry(tag, level, x, y, position, (UInt32)fi.Length);

                UInt32 index = entry.ComputeHash() % (UInt32)header.HashBuckets;
                byte[] buf = null;

                // Copy the input file stream to the end of the file
                using (FileStream ifs = File.Open(inputFilename, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    int len = (int)fi.Length;
                    buf = new byte[fi.Length];

                    ifs.Read(buf, 0, len);
                    fileStream.Write(buf, 0, len);
                    ifs.Close();
                }

                long hep = GetHashEntryPosition(index);
                entry.NextEntryInChain = hep;

                // Update the Hash Table
                WriteHashEntryPosition(index, header.NextFreeDirectoryEntry);

                // Write the directory entry
                fileStream.Seek(header.NextFreeDirectoryEntry, SeekOrigin.Begin);

                entryData = GetEntryBytes();
                fileStream.Write(entryData, 0, entryData.Length);

                // Update Header
                header.FileCount++;
                header.NextFreeDirectoryEntry += Marshal.SizeOf(entry);
                header.FreeEntries--;



                // Write it back to file
                Byte[] headerData = GetHeaderBytes();
                fileStream.Seek(0, SeekOrigin.Begin);
                fileStream.Write(headerData, 0, headerData.Length);

                //todo check for file count and extend file when we get to end.


            }
        }
Beispiel #4
0
        public Stream GetFileStreamFullSearch(int tag, int level, int x, int y)
        {
            entry = new DirectoryEntry(tag, level, x, y, 0, 0);

            UInt32 index = entry.ComputeHash() % (UInt32)(header.HashBuckets);

            long hep = GetHashEntryPosition(index);

            DirectoryEntry de;
            DirectoryEntry den = new DirectoryEntry();

            while (hep != 0)
            {
                de = GetDirectoryEntry(hep);

                if ((de.x == x) && (de.y == y) && ((de.tag == tag) || (tag == -1)) && (de.level == level))
                {
                    if (den.tag < de.tag)
                    {
                        den = de;
                        if (tag != -1)
                        {
                            break;
                        }
                    }
                }

                hep = de.NextEntryInChain;

            }

            if (den.location != 0)
            {
                MemoryStream ms = null;

                byte[] buffer = new byte[den.size];
                fileStream.Seek(den.location, SeekOrigin.Begin);
                fileStream.Read(buffer, 0, (int)den.size);
                ms = new MemoryStream(buffer);
                return ms;
            }


            return null;
        }
Beispiel #5
0
        public void AddFile(string inputFilename, int tag, int level, int x, int y)
        {
            FileInfo fi = new FileInfo(inputFilename);

            if (fi.Exists)
            {
                Byte[] entryData = null;

                // Check for empty directory and add new Directory Block
                if (header.FreeEntries == 0)
                {
                    // Write Directory Header Block
                    entry                      = new DirectoryEntry();
                    entry.size                 = 8192 * (uint)Marshal.SizeOf(entry);
                    entry.NextEntryInChain     = header.FirstDirectoryEntry;
                    entryData                  = GetEntryBytes();
                    header.FirstDirectoryEntry = dataStream.Seek(0, SeekOrigin.End);
                    dataStream.Write(entryData, 0, entryData.Length);

                    // Allocate a new 8k entries
                    header.FreeEntries            = 8192;
                    header.NextFreeDirectoryEntry = dataStream.Seek(0, SeekOrigin.End);
                    dataStream.Seek(8192 * Marshal.SizeOf(entry), SeekOrigin.End);
                    dataStream.WriteByte(42);
                }


                long position = dataStream.Seek(0, SeekOrigin.End);
                entry = new DirectoryEntry(tag, level, x, y, position, (UInt32)fi.Length);

                UInt32 index = entry.ComputeHash() % (UInt32)header.HashBuckets;
                byte[] buf   = null;

                // Copy the input file stream to the end of the file
                using (FileStream ifs = File.Open(inputFilename, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    int len = (int)fi.Length;
                    buf = new byte[fi.Length];

                    ifs.Read(buf, 0, len);
                    dataStream.Write(buf, 0, len);
                    ifs.Close();
                }

                long hep = GetHashEntryPosition(index);
                entry.NextEntryInChain = hep;

                // Update the Hash Table
                WriteHashEntryPosition(index, header.NextFreeDirectoryEntry);

                // Write the directory entry
                dataStream.Seek(header.NextFreeDirectoryEntry, SeekOrigin.Begin);

                entryData = GetEntryBytes();
                dataStream.Write(entryData, 0, entryData.Length);

                // Update Header
                header.FileCount++;
                header.NextFreeDirectoryEntry += Marshal.SizeOf(entry);
                header.FreeEntries--;



                // Write it back to file
                Byte[] headerData = GetHeaderBytes();
                dataStream.Seek(0, SeekOrigin.Begin);
                dataStream.Write(headerData, 0, headerData.Length);

                //todo check for file count and extend file when we get to end.
            }
        }