コード例 #1
0
        public static void Write(Partition p, PulsarFSBlock b)
        {
            Byte[] data  = new Byte[p.BlockSize];
            int    index = 0;

            if (b.Used)
            {
                data[index++] = 0x01;
            }
            else
            {
                data[index++] = 0x00;
            }
            Byte[] x = BitConverter.GetBytes(b.ContentSize);
            for (int i = 0; i < x.Length; i++)
            {
                data[index++] = x[i];
            }
            x = BitConverter.GetBytes(b.TotalSize);
            for (int i = 0; i < x.Length; i++)
            {
                data[index++] = x[i];
            }
            x = BitConverter.GetBytes(b.NextBlock);
            for (int i = 0; i < x.Length; i++)
            {
                data[index++] = x[i];
            }
            x = b.Content;
            for (int i = 0; i < x.Length; i++)
            {
                data[index++] = x[i];
            }
            p.WriteBlock(b.BlockNumber, 1, data);
        }
コード例 #2
0
        /// <summary>
        /// Gets the last PulsarFSBlock of the directory
        /// </summary>
        private PulsarFSBlock GetBlockToEdit()
        {
            PulsarFSBlock ret = _StartBlock;

            while (ret.NextBlock != 0)
            {
                ret = PulsarFSBlock.Read(_StartBlock.Partition, _StartBlock.NextBlock);
            }
            if (ret.BlockNumber == _StartBlock.BlockNumber)
            {
                ret                   = PulsarFSBlock.GetFreeBlock(part);
                ret.Used              = true;
                ret.ContentSize       = 0;
                ret.NextBlock         = 0;
                _StartBlock.NextBlock = ret.BlockNumber;
                PulsarFSBlock.Write(part, _StartBlock);
                PulsarFSBlock.Write(part, ret);
            }
            if (part.NewBlockArray(1).Length - ret.ContentSize < 12)
            {
                PulsarFSBlock b = PulsarFSBlock.GetFreeBlock(part);
                if (b == null)
                {
                    return(null);
                }
                ret.NextBlock = b.BlockNumber;
                PulsarFSBlock.Write(part, ret);
                b.Used = true;
                ret    = b;
            }
            return(ret);
        }
コード例 #3
0
 /// <summary>
 /// Creates a new PulsarDirectory Object
 /// </summary>
 /// <param name="p">The partition to use</param>
 /// <param name="bn">The block number we want to use</param>
 /// <param name="pa">The path of the new directory</param>
 public PulsarDirectory(Partition p, ulong bn, String pa)
 {
     _Path       = pa;
     part        = p;
     _StartBlock = PulsarFSBlock.Read(p, bn);
     if (bn == 1 && pa == "/" && _StartBlock.Content[0] != '/')
     {
         Char[] nm = "/".ToCharArray();
         for (int i = 0; i < nm.Length; i++)
         {
             _StartBlock.Content[i] = (byte)nm[i];
         }
         _StartBlock.Used      = true;
         _StartBlock.NextBlock = 0;
         PulsarFSBlock.Write(p, _StartBlock);
     }
     if (!_StartBlock.Used)
     {
         _StartBlock.Used = true;
         String n = "New Directory";
         if (pa == PulsarFileSystem.separator)
         {
             _Path = "";
             n     = pa;
         }
         CreateEntry(part, _StartBlock, n);
     }
 }
コード例 #4
0
        /// <summary>
        /// Gets all PulsarEntries contained in this PulsarDirectory
        /// </summary>
        public PulsarEntry[] GetEntries()
        {
            PulsarFSBlock      curb = _StartBlock;
            List <PulsarEntry> d    = new List <PulsarEntry>();

            while (curb.NextBlock != 0)
            {
                int index = 0;
                curb = PulsarFSBlock.Read(_StartBlock.Partition, _StartBlock.NextBlock);
                while (index < curb.ContentSize)
                {
                    ulong a = BitConverter.ToUInt64(curb.Content, index);
                    index += 8;
                    uint sep = BitConverter.ToUInt32(curb.Content, index);
                    index += 4;
                    if (sep == 1)
                    {
                        d.Add(new PulsarDirectory(part, a, PulsarFileSystem.CombineDir(_Path, Name)));
                    }
                    else if (sep == 2)
                    {
                        d.Add(new PulsarFile(part, a, PulsarFileSystem.CombineDir(_Path, Name)));
                    }
                }
            }
            return(d.ToArray());
        }
コード例 #5
0
ファイル: PulsarFileSystem.cs プロジェクト: guideX/pulsar
        public static void ClearBlocks(PulsarFSBlock StartBlock)
        {
            PulsarFSBlock b = StartBlock;

            while (b.NextBlock != 0)
            {
                b      = PulsarFSBlock.Read(b.Partition, b.NextBlock);
                b.Used = false;
                PulsarFSBlock.Write(mFS.Partition, b);
            }
        }
コード例 #6
0
 /// <summary>
 /// Creates a new PulsarFile Object
 /// </summary>
 /// <param name="p">The partition to use</param>
 /// <param name="bn">The block number we want to use</param>
 /// <param name="pa">The path of the new directory</param>
 public PulsarFile(Partition p, ulong bn, String pa)
 {
     _Path       = pa;
     part        = p;
     _StartBlock = PulsarFSBlock.Read(p, bn);
     if (!_StartBlock.Used)
     {
         _StartBlock.Used = true;
         String n = "New File";
         CreateEntry(part, _StartBlock, n);
     }
 }
コード例 #7
0
 public static PulsarFSBlock GetFreeBlock(Partition p)
 {
     for (ulong i = 1; i < p.BlockCount; i++)
     {
         PulsarFSBlock b = Read(p, i);
         if (!b.Used)
         {
             return(b);
         }
     }
     return(null);
 }
コード例 #8
0
        /// <summary>
        /// Permits to remove a PulsarFSBlock by passing it
        /// </summary>
        /// <param name="PulsarDirectory">The PulsarFSBlock to remove</param>
        private void DeleteBlock(PulsarFSBlock PulsarFSBlock)
        {
            PulsarFSBlock curb = _StartBlock;

            while (curb.NextBlock != 0)
            {
                int         index = 0;
                bool        found = false;
                List <Byte> cont  = new List <Byte>();
                curb = PulsarFSBlock.Read(_StartBlock.Partition, _StartBlock.NextBlock);
                while (index < curb.ContentSize)
                {
                    ulong  a   = BitConverter.ToUInt64(curb.Content, index);
                    Byte[] app = BitConverter.GetBytes(a);
                    for (int i = 0; i < app.Length; i++)
                    {
                        cont.Add(app[i]);
                    }
                    index += 8;
                    uint sep = BitConverter.ToUInt32(curb.Content, index);
                    index += 4;
                    if (a == PulsarFSBlock.BlockNumber)
                    {
                        app = BitConverter.GetBytes((uint)0);
                        for (int i = 0; i < app.Length; i++)
                        {
                            cont.Add(app[i]);
                        }
                        found = true;
                    }
                    else
                    {
                        app = BitConverter.GetBytes(sep);
                        for (int i = 0; i < app.Length; i++)
                        {
                            cont.Add(app[i]);
                        }
                    }
                }
                if (found)
                {
                    curb.Content     = cont.ToArray();
                    curb.ContentSize = (uint)cont.Count;
                    PulsarFSBlock.Write(part, curb);
                }
            }
        }
コード例 #9
0
        /// <summary>
        /// Return's all the bytes contained in the file
        /// </summary>
        public Byte[] ReadAllBytes()
        {
            if (_StartBlock.NextBlock == 0)
            {
                return(new Byte[0]);
            }
            PulsarFSBlock b    = _StartBlock;
            List <Byte>   lret = new List <Byte>();

            while (b.NextBlock != 0)
            {
                b = PulsarFSBlock.Read(b.Partition, b.NextBlock);
                for (int i = 0; i < b.ContentSize; i++)
                {
                    lret.Add(b.Content[i]);
                }
            }
            EditEntryInfo(EntryInfoPosition.DateTimeLastAccess, Environment.DateTime.Now.TimeStamp);
            return(lret.ToArray());
        }
コード例 #10
0
 /// <summary>
 /// Creates a new PulsarEntry in the current directory
 /// </summary>
 /// <param name="p">The partition where to create the new PulsarEntry</param>
 /// <param name="b">The block to write on</param>
 /// <param name="name">The new PulsarEntry's name</param>
 protected static PulsarFSBlock CreateEntry(Partition p, PulsarFSBlock b, String n)
 {
     if (b != null && ((!Utils.StringContains(n, InvalidChars)) || b.BlockNumber == 0))
     {
         b.Used      = true;
         b.NextBlock = 0;
         b.TotalSize = 0;
         Char[] nm = n.ToCharArray();
         for (int i = 0; i < nm.Length; i++)
         {
             b.Content[i] = (byte)nm[i];
         }
         if (b.BlockNumber != 0)
         {
             Utils.CopyByteToByte(BitConverter.GetBytes(Environment.DateTime.Now.TimeStamp), 0, b.Content, (int)MaxNameSize + (int)EntryInfoPosition.DateTimeCreated, 8, false);
         }
         b.Content[nm.Length] = 0;
         b.ContentSize        = (uint)nm.Length;
         PulsarFSBlock.Write(p, b);
         return(b);
     }
     return(null);
 }
コード例 #11
0
        /// <summary>
        /// Creates a new PulsarFile to the current directory
        /// </summary>
        /// <param name="Name">The new PulsarFile's name</param>
        public void AddFile(String Name)
        {
            PulsarEntry[] dirs = GetEntries();
            for (int i = 0; i < dirs.Length; i++)
            {
                if (dirs[i].Name == Name)
                {
                    Helper.WriteLine("Entry with same Name already exists!");
                    return;
                }
            }
            PulsarFSBlock curb     = GetBlockToEdit();
            PulsarFSBlock newfileb = CreateEntry(part, Name);

            //if (newfileb != null)
            //{
            BitConverter.GetBytes(newfileb.BlockNumber).CopyTo(curb.Content, curb.ContentSize);
            BitConverter.GetBytes((uint)2).CopyTo(curb.Content, curb.ContentSize + 8);
            curb.ContentSize += 12;
            PulsarFSBlock.Write(part, curb);
            EditEntryInfo(EntryInfoPosition.DateTimeModified, Environment.DateTime.Now.TimeStamp);
            EditEntryInfo(EntryInfoPosition.DateTimeLastAccess, Environment.DateTime.Now.TimeStamp);
            //}
        }
コード例 #12
0
        /// <summary>
        /// Writes all the specified Bytes into the file
        /// </summary>
        /// <param name="Data">The array Byte to write into file</param>
        public void WriteAllBytes(Byte[] Data)
        {
            if (_StartBlock.NextBlock != 0)
            {
                PulsarFileSystem.ClearBlocks(_StartBlock);
                _StartBlock.NextBlock = 0;
                PulsarFSBlock.Write(PulsarFileSystem.mFS.Partition, _StartBlock);
            }
            int           index = 0;
            PulsarFSBlock curb  = PulsarFSBlock.GetFreeBlock(PulsarFileSystem.mFS.Partition);

            _StartBlock.NextBlock = curb.BlockNumber;
            PulsarFSBlock.Write(part, _StartBlock);
            do
            {
                Byte[] arr = new Byte[PulsarFSBlock.MaxBlockContentSize];
                index        = Utils.CopyByteToByte(Data, index, arr, 0, arr.Length);
                curb.Used    = true;
                curb.Content = arr;
                if (index != Data.Length)
                {
                    PulsarFSBlock b = PulsarFSBlock.GetFreeBlock(PulsarFileSystem.mFS.Partition);
                    curb.NextBlock   = b.BlockNumber;
                    curb.ContentSize = (uint)arr.Length;
                    PulsarFSBlock.Write(PulsarFileSystem.mFS.Partition, curb);
                    curb = b;
                }
                else
                {
                    curb.ContentSize = (uint)(Data.Length % arr.Length);
                    PulsarFSBlock.Write(PulsarFileSystem.mFS.Partition, curb);
                }
            }while (index != Data.Length);
            EditEntryInfo(EntryInfoPosition.DateTimeModified, Environment.DateTime.Now.TimeStamp);
            EditEntryInfo(EntryInfoPosition.DateTimeLastAccess, Environment.DateTime.Now.TimeStamp);
        }
コード例 #13
0
 /// <summary>
 /// Creates a new PulsarEntry in the current directory. Uses a random Block.
 /// </summary>
 /// <param name="p">The partition where to create the new PulsarEntry</param>
 /// <param name="name">The new PulsarEntry's name</param>
 protected static PulsarFSBlock CreateEntry(Partition p, String name)
 {
     return(CreateEntry(p, PulsarFSBlock.GetFreeBlock(p), name));
 }