Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Вопрос про файловые системы и С++


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

Уважаемые, помогите разобраться

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

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

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

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

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

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

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

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


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

с помощью http://msdn.microsoft.com/en-us/library/aa364232(VS.85).aspx smile 

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

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

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

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

Спасибо большое

Автор: Lazin 3.1.2009, 23:11
еще есть библиотека boost::filesystem

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

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

Спасибо

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

Borland C++ 3.1  -> Help 
 smile 

Автор: seravr 4.1.2009, 00:19
спасибо

Автор: seravr 4.1.2009, 12:12
Товарищи, скачал методичку про ТЕАЫ http://window.edu.ru/window_catalog/files/r29155/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;


   }


Автор: xvr 5.1.2009, 12:59
Ой! А может не надо начинать изучать програмирование с ковыряния в структурах физического диска?  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.

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

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

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

Автор: seravr 5.1.2009, 15:38
Спасибо всем огромное, очень благодарен за помощь

Автор: andrew_121 5.1.2009, 15:57
Цитата(seravr @ 5.1.2009,  15:38)
Спасибо всем огромное, очень благодарен за помощь

Тему не забудь закрыть.
И на плюсики участников нажать. smile 

Автор: Kallikanzarid 6.1.2009, 13:53
Офигеть. Низкоуровневая работа с файловой системой - не то, чем обычно занимаются оболочки. Могу посоветовать изучить исходники bash (Bourne Shell), а также почитать документацию по io.h. WinAPI в первозданном виде лучше не трогать - он не особенно прямыми руками делался.

Автор: seravr 6.1.2009, 14:52
Цитата(Kallikanzarid @ 6.1.2009,  13:53)
Офигеть. Низкоуровневая работа с файловой системой - не то, чем обычно занимаются оболочки. Могу посоветовать изучить исходники bash (Bourne Shell), а также почитать документацию по io.h. WinAPI в первозданном виде лучше не трогать - он не особенно прямыми руками делался.

Спасибо за совет, только вот ниче путевого не нагуглил поbash (Bourne Shell) и документации по io.h, где можно хорошое описание найти io.h и остальных библиотек тоже

Автор: Kallikanzarid 6.1.2009, 20:28
Значит плохо искал:
ftp://ftp.gnu.org/gnu/bash/
http://msdn.microsoft.com/en-us/library/kdfaxaay.aspx

Автор: seravr 7.1.2009, 00:02
Спасибо, тему можно закрыть

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)