Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про файловые системы и С++, помогите новичку 
V
    Опции темы
seravr
Дата 3.1.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



Товарищи, я новичок, изучил синтаксис С/C++. прорешал много задач из учебников, но все они травиальные, по сути написать существенного ничего не могу. Поставил перед собой задачу написать консоль типа командной строки, например, я ввожу директорию-прога мне выводит текущие файлы.
Ребята, но не могу ни с чего начать, дело в том, что я не знаю как вывести адрес файла или содержание подкаталога(любого). Прошу пожалуйста помочь как это организовать на стандартном с/c++ без использования WIN32, что почитать? как отобразить скрытые файлы и вывести инфу о файлах???
если есть у кого исходник типа FAR-менеджеоа, дайте ссылочку пожалуйста

Уважаемые, помогите разобраться
PM MAIL   Вверх
Void
Дата 3.1.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 2
Всего: 173



В стандартной библиотеке не предусмотрено функций, необходимых для написания такой программы, например, получения содержимого каталога. Придётся использовать платформозависимые средства: WinAPI или POSIX.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
seravr
Дата 3.1.2009, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



Я понимаю, я хочу написать простые функции сам, скажите плиз как получить доступ к файлу каталога файлов в NTFS
PM MAIL   Вверх
Void
Дата 3.1.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 2
Всего: 173



Цитата(seravr @  3.1.2009,  22:43 Найти цитируемый пост)
Я понимаю, я хочу написать простые функции сам, скажите плиз как получить доступ к файлу каталога файлов в NTFS 

Изначально было сказано:
Цитата(seravr @  3.1.2009,  21:04 Найти цитируемый пост)
Прошу пожалуйста помочь как это организовать на стандартном с/c++ без использования WIN32

Я ответил, что без WinAPI не обойтись. Либо я чего-то недопонимаю, либо корректность формулировок страдает.

В WinAPI файлы перебирать можно с помощью функций FindFirstFile/FindNextFile/FindClose. В POSIX — opendir/readdir/closedir.

Вот, кстати, и хорошая задача — написать удобную кроссплатформенную обёртку над файловыми операциями.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
seravr
Дата 3.1.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



ЯСНО, ПОДСКАжИТЕ ТОГДА КАК УЗНАТЬ 
•    •        тип файла (обычный файл, каталог, специальный файл и т. п.);
•    •        владелец файла;
•    •        создатель файла;
•    •        пароль для доступа к файлу;
•    •        информация о разрешенных операциях доступа к файлу;
•    •        времена создания, последнего доступа и последнего изменения;
•    •        текущий размер файла;
•    •        максимальный размер файла;
•    •        признак «только для чтения»;
•    •        признак «скрытый файл»;
•    •        признак «системный файл»;
•    •        признак «архивный файл»;
    •        признак «двоичный/символьный»;
•    •        признак «временный» (удалить после завершения процесса);
•    •        признак блокировки;
•    •        длина записи в файле;
•    •        указатель на ключевое поле в записи;


PM MAIL   Вверх
Lazin
Дата 3.1.2009, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(seravr @  3.1.2009,  21:15 Найти цитируемый пост)
ЯСНО, ПОДСКАжИТЕ ТОГДА КАК УЗНАТЬ

с помощью MSDN smile 
PM MAIL Skype GTalk   Вверх
Pion
Дата 3.1.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 21.2.2006

Репутация: нет
Всего: 1



Есть функции в io.h, аналогичные winapiшным
_finfirst
_findnext
_findclose

Первые две из них работают с указателем на переменную типа _finddata_t. В этой структуре есть поле attrib, содержащее всю информацию о файле...
PM MAIL   Вверх
seravr
Дата 3.1.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



Цитата(Pion @ 3.1.2009,  22:26)
Есть функции в io.h, аналогичные winapiшным
_finfirst
_findnext
_findclose

Первые две из них работают с указателем на переменную типа _finddata_t. В этой структуре есть поле attrib, содержащее всю информацию о файле...

Спасибо большое
PM MAIL   Вверх
Lazin
Дата 3.1.2009, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



еще есть библиотека boost::filesystem
PM MAIL Skype GTalk   Вверх
seravr
Дата 3.1.2009, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



Товарищи, подскажите где Вы читаете про функции, например dir.h и io.h

Добавлено через 1 минуту и 12 секунд
Цитата(Lazin @ 3.1.2009,  23:11)
еще есть библиотека boost::filesystem

Спасибо
PM MAIL   Вверх
Hades
Дата 3.1.2009, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



Цитата(seravr @  3.1.2009,  22:24 Найти цитируемый пост)
подскажите где Вы читаете про функции, например dir.h и io.h

Borland C++ 3.1  -> Help 
 smile 

Это сообщение отредактировал(а) Hades - 3.1.2009, 23:36
PM MAIL   Вверх
seravr
Дата 4.1.2009, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



спасибо
PM MAIL   Вверх
seravr
Дата 4.1.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



Товарищи, скачал методичку про ТЕАЫ http://window.edu.ru/window_catalog/files/...5/samiit172.pdf ПОМОГИТЕ Плиз ИСПРАВИТЬ КОД: ошибка при открытии в майне 

И еще просьба, подскажите что почитать для начинающего писать под систему Wnidows XP ? C чего начать???

Заранее спасибо

Код

// Пример чтения имен файлов из MFT
   #include <windows.h>
   #include <stdio.h>
   #include <winioctl.h>        // Windows NT IOCTL коды
   #include <malloc.h>


#pragma pack(1)
typedef struct tagBPB_NTFS
{
    WORD wBytesPerSec; // Байтов в секторе
    BYTE bSecPerClust; // Секторов в кластере
    WORD wResSectors; // Зарезервированных секторов
    BYTE bFATs;          // Не используется
    WORD wRootDirEnts; // Не используется
    WORD wSectors;         // Не используется
    BYTE bMedia;         // Описатель среды
    WORD wFATsecs;            // Не используется
    WORD wSecPerTrack; // Количество секторов на дорожке
    WORD wHeads;            // Количество головок
    LONG dwHiddenSect; // Количество скрытых секторов
    WORD dwBigTotalSectors; // Не используется
    WORD dwBigTotalSectorsHigh; // Не используется
    WORD dwBigSectorsPerFat; // Не используется
    WORD dwBigSectorsPerFatHigh; // Не используется
    INT64 TotalSectors; // Секторов на томе
    INT64 FirstMFT; // Сектор начала MFT
    INT64 MirrMFT; // Сектор копии MFT
    LONG ClustersPerFileRecord; // Число кластеров под файловую запись
    LONG ClustersPerIndexBlock; // Число кластеров под индексный блок
    INT64 VolumeSerialNumber; // Серийный номер тома
    LONG Checksum; // Проверочная сумма
} BPB_NTFS, FAR * LPBPB_NTFS;

// Заголовок файловой записи
struct FileRecordHeader
{
     char ID[4]; // Идентификатор файловой записи
     WORD UpDateSequenceOffset; // Смещение счетчика обновления последовательности
     WORD CountItemUpDateSequence; // Количество элементов массива, содержащего значения
                                    // обновления последовательности
     BYTE Reserve[8]; // Зарезервировано
     WORD NumSecquence; // Номер последовательности
     WORD HardLinkCount; // Счетчик жестких ссылок
     WORD AttribBegOffset; // Смещение второй части файловой записи, последовательности
                         // атрибутов файла
     WORD Flag;             // Флаг
     DWORD RealSize; // Реальный размер файловой записи
     DWORD ByteAllocate; // Количество байт, выделенных под файловую запись
     INT64 FileReference; // Ссылка на основную запись
     WORD AttribMaxID; // Идентификатор атрибута, имеющий максимальное значение,
                         // увеличенный на 1
     WORD UpDateSequenceNum; // Массива обновления последовательности
};

struct StandartAttribHeader // Заголовок атрибута
{
    DWORD Type; // Тип атрибута
    DWORD Length; // Длина атрибута
    BYTE FlagRez; // Флаг резидентности
    BYTE LengthName; // Длина имени
    WORD ContentOffset; // Смещение потока
    WORD Flag; // Флаг компрессии


     WORD ID; // Идентификатор
};

struct FileNameAttrCont // Содержание атрибута имени
{
       INT64 FileReference; // Файловая ссылка на директорию
       BYTE Time[32]; // Время
       INT64 ByteAllocate; // Распределено байт
       INT64 RealSize;    // Реальный размер
       INT64 Flag; // флаг
       BYTE LengthName; // Длина имени
       BYTE TypeName; // Тип имени
       char FileName[30]; // Имя
};
#pragma pack()

byte buf[512];
byte buf_FileRec[1024];

int main(int argc, char **argv)
{
    HANDLE h;

     // открываем логический диск
     h=CreateFile("\\\\.\\C:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

     // Проверяем успешно ли закончилась попытка открытия логического диска
     if (h != INVALID_HANDLE_VALUE)
     {
          DWORD dwBytesRead; DWORD dwBytesWrite; LONG BeginMFTSector;

        // Читаем первый сектор раздела
        ReadFile(h, buf, 512, &dwBytesRead, NULL);
        // Извлекаем из считанного сектора блок параметров BIOS
        BPB_NTFS sbpbntfs;
        memcpy(&sbpbntfs, buf + 11, 73);

        // Определяем сектор начала MFT
        BeginMFTSector = sbpbntfs.bSecPerClust * sbpbntfs.FirstMFT;

        // Позиционируемся на начало MFT
        DWORD dwPtrLow = SetFilePointer (h, 512*(BeginMFTSector+32), NULL, FILE_BEGIN);

        // Читаем блок из MFT
        ReadFile(h, buf_FileRec, 1024, &dwBytesRead, NULL);

        // Извлекаем из считанного заголовок файловой записи
        FileRecordHeader fHeader;
        memcpy(&fHeader, buf_FileRec, sizeof(fHeader));

        DWORD OffsetFileRec = 0;
        while(strncmp(fHeader.ID, "FILE",4) == 0)
        {
            // Читаем из MFT файловую запись
            ReadFile(h, buf_FileRec, 1024, &dwBytesRead, NULL);
       // Извлекаем из считанного заголовок файловой записи
       FileRecordHeader fHeader;
       memcpy(&fHeader, buf_FileRec, sizeof(fHeader));

       // Извлекаем из считанного заголовок атрибута
       StandartAttribHeader stattrHeader;
       WORD attrOffset;
       attrOffset = fHeader.AttribBegOffset;
       memcpy(&stattrHeader, buf_FileRec + attrOffset, sizeof(StandartAttribHeader));

       // Пока не прочли все атрибуты
       while(stattrHeader.ID != fHeader.AttribMaxID - 1)
       {
           // Извлекаем из считанного заголовок очередного атрибута
           attrOffset = attrOffset + stattrHeader.Length;
           memcpy(&stattrHeader, buf_FileRec + attrOffset, sizeof(StandartAttribHeader));

           // Если последний атрибут, выходим из цикла
           if(stattrHeader.Type == 0xffffffff) break;

           switch(stattrHeader.Type)
           {
               case 0x30: // Если тип атрибута имя
               {
                   FileNameAttrCont fNameAttr;

                     // Извлекаем из считаного содержание атрибута имя
                     memcpy(&fNameAttr , buf_FileRec + attrOffset + 24 +
                     stattrHeader.ContentOffset, sizeof(FileNameAttrCont ));

                     // Если длина имени больше нуля, выводим имя на экран
                     if(fNameAttr. LengthName > 0)
                     {
                          char MultiByteStr[30]; int dj = 0;
                          for(int di = 0; di < fNameAttr.LengthName * 2; di = di+2)
                          {
                               MultiByteStr[dj] = fNameAttr.FileName[di]; dj++;
                          }
                          MultiByteStr[dj] = '\0';
                          printf("%s\n",MultiByteStr);
                     }
                     break;
               }
           }
       }
       // Определяем смещение следующей файловой записи
       OffsetFileRec = OffsetFileRec + 1024;

       // Позиционируемся на файловую запись
       dwPtrLow = SetFilePointer (h, 512*(BeginMFTSector+32) + OffsetFileRec, NULL,
       FILE_BEGIN);
   }
   // Закрываем дескриптор
   CloseHandle(h);
}
printf("The End");
return 0;


   }



Это сообщение отредактировал(а) JackYF - 4.1.2009, 19:08
PM MAIL   Вверх
xvr
Дата 5.1.2009, 12:59 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Ой! А может не надо начинать изучать програмирование с ковыряния в структурах физического диска?  smile Систему давно переустанавливал?  smile 
По поводу ошибки - 
Цитата

* The caller must have administrative privileges. For more information, see Running with Special Privileges. 
* The dwCreationDisposition parameter must have the OPEN_EXISTING flag. 
* When opening a volume or floppy disk, the dwShareMode parameter must have the FILE_SHARE_WRITE flag. 
 Так как на диске C уже есть открытые файлы (хотя бы сама система), то увы (или ура, уж и не знаю) - система не даст открыть этот volume.

PM MAIL   Вверх
andrew_121
Дата 5.1.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



seravr, Слушай друг... Есть такая софтина(OpenSource) UltraDefrag-ом зовется: http://ultradefrag.sourceforge.net/
В ней все уже сделано. Сам юзал для низкоуровнего доступа к ФС.

Добавлено через 4 минуты и 54 секунды
Цитата(xvr @  5.1.2009,  12:59 Найти цитируемый пост)
система не даст открыть этот volume.

Даст. При некотором фитче.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.