/// <summary>
        /// </summary>
        /// <param name="path"></param>
        public void ReadFile(string path)
        {
            logger.InternalDebug("Opening file: \"{0}\"", path);
            var reader = TargetSpecificUtil.StreamReader.Do(path, Encoding) as StreamReader;

            // StreamReader reader = new StreamReader(path, Encoding.UTF8);
            lastReadAction = LastReadAction.NONE;
            var nLine = 0;

            logger.InternalDebug("Reading file: \"{0}\"", path);
            Read(reader, 0, ref nLine);
            logger.InternalDebug("File read: \"{0}\", {1} line(s)", path, nLine);
            reader.Dispose();
        }
        /// <exception cref="CorruptFileException"></exception>
        private void Read(StreamReader reader, int level, ref int nLine)
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                nLine++;

                if (line.Contains(Comment))
                {
                    line = line.Remove(line.IndexOf(Comment));
                }
                line = line.Replace(Tab, string.Empty);
                var oldline = line;
                line = line.Replace(Space, string.Empty);

                if (line == string.Empty)
                {
                    continue;
                }

                if (lastReadAction == LastReadAction.NEWNODE && line != NodeBegin)
                {
                    throw new CorruptFileException(nLine);
                }

                if (line == NodeBegin)
                {
                    if (lastReadAction != LastReadAction.NEWNODE)
                    {
                        throw new CorruptFileException(nLine);
                    }
                    nodes.Last().node.Read(reader, level + 1, ref nLine);
                    lastReadAction = LastReadAction.STARTNODE;
                }
                else if (line == NodeEnd)
                {
                    if (level == 0)
                    {
                        throw new CorruptFileException(nLine);
                    }
                    lastReadAction = LastReadAction.ENDNODE;
                    return;
                }
                else if (line.ToCharArray().Contains(ValueIs))
                {
                    var splitIndex = oldline.IndexOf(ValueIs);
                    var key        = oldline.Substring(0, splitIndex);
                    var value      = oldline.Substring(splitIndex + 1);
                    while (key.EndsWith(Space))
                    {
                        key = key.Remove(key.Length - 1);
                    }
                    while (value.StartsWith(Space))
                    {
                        value = value.Remove(0, 1);
                    }
                    if (key == "" || value == "")
                    {
                        throw new CorruptFileException(nLine);
                    }
                    logger.InternalDebug("In node \"{0}\": new item \"{1}\" = {2}", Name, key, value);
                    items.Add(key, value);
                    lastReadAction = LastReadAction.ITEM;
                }
                else
                {
                    logger.InternalDebug("In node \"{0}\": new child node \"{1}\"", Name, line);
                    nodes.Add(line, new SerializeNode(this, line));
                    lastReadAction = LastReadAction.NEWNODE;
                }
            }
            if (level != 0)
            {
                throw new CorruptFileException(nLine);
            }
        }