示例#1
0
        /// <summary>
        /// Gets the last NoobFSBlock of the directory
        /// </summary>
        private NoobFSBlock GetBlockToEdit()
        {
            NoobFSBlock ret = _StartBlock;

            while (ret.NextBlock != 0)
            {
                ret = NoobFSBlock.Read(_StartBlock.Partition, _StartBlock.NextBlock);
            }
            if (ret.BlockNumber == _StartBlock.BlockNumber)
            {
                ret                   = NoobFSBlock.GetFreeBlock(part);
                ret.Used              = true;
                ret.ContentSize       = 0;
                ret.NextBlock         = 0;
                _StartBlock.NextBlock = ret.BlockNumber;
                NoobFSBlock.Write(part, _StartBlock);
                NoobFSBlock.Write(part, ret);
            }
            if (part.NewBlockArray(1).Length - ret.ContentSize < 12)
            {
                NoobFSBlock b = NoobFSBlock.GetFreeBlock(part);
                if (b == null)
                {
                    return(null);
                }
                ret.NextBlock = b.BlockNumber;
                NoobFSBlock.Write(part, ret);
                b.Used = true;
                ret    = b;
            }
            return(ret);
        }
示例#2
0
 /// <summary>
 /// Creates a new NoobDirectory 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 NoobDirectory(Partition p, ulong bn, String pa)
 {
     _Path       = pa;
     part        = p;
     _StartBlock = NoobFSBlock.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;
         NoobFSBlock.Write(p, _StartBlock);
     }
     if (!_StartBlock.Used)
     {
         _StartBlock.Used = true;
         String n = "New Directory";
         if (pa == NoobFileSystem.separator)
         {
             _Path = "";
             n     = pa;
         }
         CreateEntry(part, _StartBlock, n);
     }
 }
示例#3
0
        /// <summary>
        /// Gets all NoobEntries contained in this NoobDirectory
        /// </summary>
        public NoobEntry[] GetEntries()
        {
            NoobFSBlock      curb = _StartBlock;
            List <NoobEntry> d    = new List <NoobEntry>();

            while (curb.NextBlock != 0)
            {
                int index = 0;
                curb = NoobFSBlock.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 NoobDirectory(part, a, NoobFileSystem.CombineDir(_Path, Name)));
                    }
                    else if (sep == 2)
                    {
                        d.Add(new NoobFile(part, a, NoobFileSystem.CombineDir(_Path, Name)));
                    }
                }
            }
            return(d.ToArray());
        }
示例#4
0
        /// <summary>
        /// Clears every block starting from this one
        /// </summary>
        /// <param name="StartBlock">The block to start from</param>
        public static void ClearBlocks(NoobFSBlock StartBlock)
        {
            NoobFSBlock b = StartBlock;

            while (b.NextBlock != 0)
            {
                b      = NoobFSBlock.Read(b.Partition, b.NextBlock);
                b.Used = false;
                NoobFSBlock.Write(mFS.Partition, b);
            }
        }
 /// <summary>
 /// Creates a new NoobFile 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 NoobFile(Partition p, ulong bn, String pa)
 {
     _Path       = pa;
     part        = p;
     _StartBlock = NoobFSBlock.Read(p, bn);
     if (!_StartBlock.Used)
     {
         _StartBlock.Used = true;
         String n = "New File";
         CreateEntry(part, _StartBlock, n);
     }
 }
示例#6
0
        /// <summary>
        /// Permits to remove a NoobFSBlock by passing it
        /// </summary>
        /// <param name="noobDirectory">The NoobFSBlock to remove</param>
        private void DeleteBlock(NoobFSBlock noobFSBlock)
        {
            NoobFSBlock curb = _StartBlock;

            while (curb.NextBlock != 0)
            {
                int         index = 0;
                bool        found = false;
                List <Byte> cont  = new List <Byte>();
                curb = NoobFSBlock.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 == noobFSBlock.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;
                    NoobFSBlock.Write(part, curb);
                }
            }
        }
        /// <summary>
        /// Return's all the bytes contained in the file
        /// </summary>
        public Byte[] ReadAllBytes()
        {
            if (_StartBlock.NextBlock == 0)
            {
                return(new Byte[0]);
            }
            NoobFSBlock b    = _StartBlock;
            List <Byte> lret = new List <Byte>();

            while (b.NextBlock != 0)
            {
                b = NoobFSBlock.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());
        }