/// <summary>
        /// 현재 선택된 청크를 저장하고 다음 청크를 선택한다.
        /// </summary>
        /// <returns>다음 청크의 유무</returns>
        public bool SaveNext()
        {
            // 저장할 청크가 없으면 바로 종료
            if (m_board.ChunkCount <= 0)
            {
                return(false);
            }


            // 임시 보드에 실제 보드를 얕은 복사
            if (m_tempBoard == null)
            {
                m_tempBoard = new ChunkBoard <Tile>(m_board.ChunkSize);

                foreach (var chunkInformation in m_board.GetEnumerable())
                {
                    m_tempBoard.SetChunkAt(chunkInformation.X, chunkInformation.Y,
                                           chunkInformation.Chunk);
                }
            }

            // 열거자 얻기
            if (m_currentSaveChunk == null)
            {
                m_currentSaveChunk = m_tempBoard.GetEnumerable().GetEnumerator();

                if (m_currentSaveChunk.MoveNext() == false)
                {
                    m_tempBoard.Clear();
                    m_tempBoard        = null;
                    m_currentSaveChunk = null;
                    return(false);
                }
            }


            // 열거자가 현재 가르키는 청크 저장
            var chunkInfo = m_currentSaveChunk.Current;
            var chunk     = chunkInfo.Chunk;

            string fileName = string.Format("{0}_{1}.dat", chunkInfo.X, chunkInfo.Y);

            using (BinaryWriter bw = new BinaryWriter(new FileStream(this.BoardPath + fileName, FileMode.Create)))
            {
                // 파일 버전
                bw.Write(Application.ProductVersion.ToString());


                // 청크 위치
                bw.Write(chunkInfo.X);
                bw.Write(chunkInfo.Y);

                // 청크 크기
                bw.Write(this.Board.ChunkSize);

                // 타일 정보
                for (int x = 0; x < chunk.GetLength(0); ++x)
                {
                    for (int y = 0; y < chunk.GetLength(1); ++y)
                    {
                        var tile = chunk[x, y];

                        tile.WriteToStream(bw);
                    }
                }
            }


            // 다음 청크로 넘어가고 없으면 종료
            if (m_currentSaveChunk.MoveNext())
            {
                return(true);
            }
            else
            {
                m_tempBoard.Clear();
                m_tempBoard        = null;
                m_currentSaveChunk = null;
                return(false);
            }
        }
        /// <summary>
        /// 현재 선택된 청크를 불러오고 다음 청크를 선택한다.
        /// </summary>
        /// <returns>다음 청크의 유무</returns>
        public bool LoadNext()
        {
            // 열거자 얻기
            if (m_currentLoadChunk == null)
            {
                m_board.Clear();


                m_currentLoadChunk = Directory.EnumerateFileSystemEntries(this.BoardPath).GetEnumerator();

                if (m_currentLoadChunk.MoveNext() == false)
                {
                    m_currentLoadChunk = null;
                    return(false);
                }
            }


            try
            {
                using (BinaryReader br = new BinaryReader(new FileStream(m_currentLoadChunk.Current, FileMode.Open)))
                {
                    // 파일 버전
                    Utility.Version fileVersion = new Utility.Version(br.ReadString());


                    // 청크 위치
                    int chunkX = br.ReadInt32();
                    int chunkY = br.ReadInt32();

                    // 청크 생성
                    m_board.CreateChunkAt(chunkX, chunkY);
                    var chunk = m_board.GetChunkAt(chunkX, chunkY);

                    // 청크 크기
                    int chunkSize = br.ReadInt32();

                    // 타일 정보
                    for (int x = 0; x < chunkSize; ++x)
                    {
                        for (int y = 0; y < chunkSize; ++y)
                        {
                            // 타일 설정
                            var tile = chunk[x, y];

                            tile.ReadFromStream(br);


                            // 설치된 것이 있다면 목록에 위치를 추가
                            if (tile.IsFactoryTile)
                            {
                                m_factoryList.Add(new Point(
                                                      chunkX * this.Board.ChunkSize + x,
                                                      chunkY * this.Board.ChunkSize + y));
                            }
                            else if (tile.IsCompanyTile)
                            {
                                m_companyList.Add(new Point(
                                                      chunkX * this.Board.ChunkSize + x,
                                                      chunkY * this.Board.ChunkSize + y));
                            }
                            else if (tile.IsChipTile)
                            {
                                m_chipList.Add(new Point(
                                                   chunkX * this.Board.ChunkSize + x,
                                                   chunkY * this.Board.ChunkSize + y));
                            }
                        }
                    }
                }
            }
            catch (FileNotFoundException)
            { }


            // 다음 파일로 넘어감
            if (m_currentLoadChunk.MoveNext())
            {
                return(true);
            }
            else
            {
                m_currentLoadChunk = null;
                return(false);
            }
        }