Программа поиска в свободных кластерах символьных последовательностей из заданного набора

Автор работы: Пользователь скрыл имя, 05 Апреля 2011 в 18:19, курсовая работа

Описание работы

В данной курсовой работе необходимо разработать программу для поиска в свободных кластерах символьных последовательностей из заданного набора.

Файлы: 1 файл

Курсач_СПО.(готов).doc

— 756.50 Кб (Скачать файл)

            //Вычисление длины файла в кластерах

            _SizeFileClusters = _SizeFile / _Disk.ClusterSize + (uint)((_SizeFile % _Disk.ClusterSize == 0) ? 0 : 1); 

            #region Получение короткого имени файла

            StringBuilder lpszShortPath = new StringBuilder(512);

            UInt32 ShortNameRes = Win32API.GetShortPathName(new StringBuilder(_File.FullName), lpszShortPath, 512);

            if (ShortNameRes==0)

                _Error = _Error | 1;

            #endregion

           

            //Вспомогательные переменные

            Int32 L32Bytes;//младшие 32 бита long

            Int32 H32Bytes;//Старшие 32 бита long

            UInt32 PositionRes;// Результат позиционирования

            byte[] lpBuffer = new byte[512];// Буффер для записи и чтения

            UInt32 pNumberOfBytesRead;//Число прочитанных байт

            UInt32 pNumberOfBytesWrite;//Число записанных байт

            bool ReadRes;//Результат чтения

            bool WriteRes;//Результат записи

            ulong Position;//Позиция на диске

            Encoding ASCIIConverter=Encoding.GetEncoding(866);//Перекодировщик 866 в Unicod

            if (_Error==0)

            {

                #region

                string ShortNameFile = lpszShortPath.ToString().Substring(lpszShortPath.ToString().LastIndexOf('\\')+1);

                if (ShortNameFile.IndexOf(".") != -1)

                {

                    ShortNameFile = ShortNameFile.Insert(ShortNameFile.IndexOf("."), new string(' ', 8 - ShortNameFile.IndexOf(".")));

                    ShortNameFile = ShortNameFile.Replace(".", "");

                }

                ShortNameFile = ShortNameFile + new string(' ', 11 - ShortNameFile.Length);

                #endregion 

                #region Получение позиции файла

                //Поиск записи файла в заданном каталоге.

                //Позиция каталога задана переменной BeginingDyrectory

                if(Disk.cHDevice.IsInvalid==false && _Disk.cHDevice.IsClosed==false)

                {

                    Position = BeginingDyrectory;//Позиция на диске для начала поиска

                    L32Bytes = (Int32)((Position << 32) >> 32);//Получение младших 32 бит позици

                    H32Bytes = (Int32)(Position >> 32);//Получение старших 32 бит позици

                    //Позиционируемся на начало каталога

                    PositionRes = Win32API.SetFilePointer(Disk.cHDevice, L32Bytes, out H32Bytes, 0);

                    if(!(PositionRes==Win32API.INVALID_SET_FILE_POINTER && Win32API.GetLastError()!=0))

                    {

                        while (true)

                        {

                            //Чтение сектора в каталоге

                            ReadRes = Win32API.ReadFile(_Disk.cHDevice, lpBuffer, 512, out pNumberOfBytesRead, IntPtr.Zero);

                            if (lpBuffer[0] == 0)

                            {

                                _Error = _Error|2;

                                break;

                            }

                            //Разбиение прочитанного сектора на записи длиной 32 байта

                            for (int p = 0; p < 16; p++)

                            {

                                //Поиск имени файла в начальных 11 байтах каждой записи

                                if (ShortNameFile.ToUpper() == ASCIIConverter.GetString(lpBuffer, p * 32, 11).ToUpper())

                                {

                                    _PositionSector = (uint)Position;//Сектор в котором найден файл

                                    _PositionByte = (uint)p*32+28;// Смещение где находится длина файла

                                    break;

                                }

                            }

                            if (_PositionByte != 0)

                                break;

                            Position += 512;// если сектор просмотрен и файл не найден, чтение следующего сектора

                        }

                    }

                    else

                        _Error = _Error|4;//Возведение 4 бита ошибки

                }

                else

                    _Error = _Error|8;//Возведение 5 бита ошибки

                #endregion

            }

                        if(_Error==0 && _SizeSlack>0 )

            {

                #region

                Position = _PositionSector;//Позиция сектора где найден файл

                L32Bytes = BitConverter.ToInt32(BitConverter.GetBytes(Position), 0);//Младшие 32 бита позиции

                H32Bytes = BitConverter.ToInt32(BitConverter.GetBytes(Position), 4);//Старшие 32 бита позиции

               

                //Выполняем функцию позиционирования на нужный сектор

                PositionRes = Win32API.SetFilePointer(Disk.cHDevice, L32Bytes, out H32Bytes, 0);               

                if(!(PositionRes==Win32API.INVALID_SET_FILE_POINTER && Win32API.GetLastError()!=0))

                {

                    //Изменяем содержимое нужного сектора, сектор был прочитан ранее при поиске записи

                    //Изменяем только те байты которые отвечают за длину файла. Делаем длину кратную размеру сектора

                    lpBuffer[_PositionByte] = BitConverter.GetBytes(_SizeFile+_SizeSlack)[0];

                    lpBuffer[_PositionByte+1] = BitConverter.GetBytes(_SizeFile+_SizeSlack)[1];

                    lpBuffer[_PositionByte+2] = BitConverter.GetBytes(_SizeFile+_SizeSlack)[2];

                    lpBuffer[_PositionByte+3] = BitConverter.GetBytes(_SizeFile+_SizeSlack)[3];

                   

                    //Записываем измененный сектор в нужное место, где хранился оригинал   

                    WriteRes = Win32API.WriteFile(_Disk.cHDevice, lpBuffer, 512, out pNumberOfBytesWrite, IntPtr.Zero);

Информация о работе Программа поиска в свободных кластерах символьных последовательностей из заданного набора