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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с каталогами под DOS 
:(
    Опции темы
Cybernetick
Дата 20.6.2011, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток! Получил лабу- вывести список всех удалённых файлов из заданного каталога и подкаталогов. Посколько WinAPI ещё не изучал, да и предмет требует реализации под DOS, бьюсь со следующим кодом-
Код

#include<stdio.h>
#include<dir.h>
#include<process.h>
#include<dos.h>
int main(void)
 {
  struct ffblk ffb;
  int done;
  printf("local directory\n");
  done = findfirst("*.txt", &ffb, FA_RDONLY);
  while(!done)
   {
   if (ffb.ff_name[1] == 0xE5)
   {
    printf("%13s ", ffb.ff_name);        // File name
    if(ffb.ff_attrib & FA_DIREC) printf("    <DIR>");
     else printf("%9ld", ffb.ff_fsize); // File size
    printf("    %02u-%02u-%4u", ffb.ff_fdate & 0x1F ,
          (ffb.ff_fdate  >> 5) & 0xF,
      ((ffb.ff_fdate >> 9) & 0x7F) + 1980); // Date
    printf("    %02u:%02u\n", (ffb.ff_ftime >> 11) & 0x1F,
       (ffb.ff_ftime >> 5) & 0x3F);      // Time
    done = findnext(&ffb);
    }
    else
    {
    printf("IF SUCKS!");
    done = findnext(&ffb);
    }
   }
   system("pause");
  return 0;
 }



по теории я понял, что нужно ловить из первого байта поля ffb.ff_name код E5h, который и означает, что файл удалён. только проблема в том, что с написанным условием в тело IF'а программа не заходит. вот и прошу совета опытных в этой среде людей- что именно я делаю не так?)
Зараннее благодарен!
PM MAIL   Вверх
triclosan
Дата 20.6.2011, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



имхо это преступление заставлять учить студентов программированию под DOS, где предполагается применять потом эти знания?

Это сообщение отредактировал(а) triclosan - 20.6.2011, 22:32
PM MAIL   Вверх
fish9370
Дата 20.6.2011, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



Цитата(Cybernetick @  20.6.2011,  22:23 Найти цитируемый пост)
что нужно ловить из первого байта поля ffb.ff_name код E5h


так лови из первого:

Код

 if (ffb.ff_name[0] == 0xE5)



--------------------
undefined
PM MAIL WWW ICQ   Вверх
Cybernetick
Дата 20.6.2011, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(fish9370 @ 20.6.2011,  22:38)
Цитата(Cybernetick @  20.6.2011,  22:23 Найти цитируемый пост)
что нужно ловить из первого байта поля ffb.ff_name код E5h


так лови из первого:

Код

 if (ffb.ff_name[0] == 0xE5)




попробовал- по прежнему это условие игнорируется... проверял кстати следующим образом-  выводил список всех *.txt-шников в каталоге, потом удалял один из них и ставил это условие... результата никакого.
PM MAIL   Вверх
fish9370
Дата 20.6.2011, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



у printf есть фича %x, сделай так

Код

while(!done) {
   printf("%x\r\n", ffb.ff_name[0]);
   if (ffb.ff_name[0] == 0xE5)



--------------------
undefined
PM MAIL WWW ICQ   Вверх
triclosan
Дата 20.6.2011, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(fish9370 @  20.6.2011,  22:50 Найти цитируемый пост)
printf("%x\r\n", ffb.ff_name[0]);

не надо

Это сообщение отредактировал(а) triclosan - 20.6.2011, 22:52
PM MAIL   Вверх
fish9370
Дата 20.6.2011, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



Цитата(triclosan @  20.6.2011,  22:52 Найти цитируемый пост)
не надо


почему?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Cybernetick
Дата 20.6.2011, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я так понял что новый printf должен будет выдавать первый байт для всех txt-шников? я вставил его и получил только одно значение, значит что у меня проверлся только один файл? 
PM MAIL   Вверх
triclosan
Дата 20.6.2011, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



fish9370, поскольку язык Си растет их Юникс-мира, в текстовом режиме принято конец строки обозначать юниксоидным символов \n - при этом в *nix системах он не меняется, а в этих ваших ДОСах превращается в \r\n

Это сообщение отредактировал(а) triclosan - 20.6.2011, 23:03
PM MAIL   Вверх
fish9370
Дата 20.6.2011, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



IF SUCKS печатает?

Добавлено через 1 минуту и 30 секунд
Цитата(triclosan @  20.6.2011,  23:02 Найти цитируемый пост)
а в этих ваших ДОСах превращается в \r\n


никогда такого не слышал, где это написанно?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Cybernetick
Дата 20.6.2011, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



предыдущая инфа была не совсем верной- вообщем прога адекватно ловит все файлы и выводит их коды, только после удаление ничего не происходит и просто вместо 6 кодов (по количеству файлов) выводит 5 и 5 раз сообщение IF SUCKS. попробовал уже даже в findfirst завести весь список известных аттрибутов- не помогло... может есть альтернатива этому методу поиска удалённого файла?
PM MAIL   Вверх
fish9370
Дата 20.6.2011, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



Цитата(Cybernetick @  20.6.2011,  23:16 Найти цитируемый пост)
может есть альтернатива этому методу поиска удалённого файла?


да, есть.. только он тебе не понравится.. нужно считывать первый сектор диска (MBR), определять где находится системный раздел, находить таблицу распрределения файлов (FAT, кстати мы имеем дело с FAT32?), пробегаться по ее каталогу и делать тоже самое..


если у тебя есть ДОС, то найди проду diskedit.. с помощью нее можно шастать по диску, и дебажить..

все это у меня лишь воспаминания, десятилетней давности..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
fish9370
Дата 21.6.2011, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



ха-ха-ха..  smile 

порылся в исходниках findfirst и вот что я нашел:

Код

/* skip this entry if it is an deleted entry */   
if (*(pBuffer + j) == 0xe5 || *(pBuffer + j) == '.')   
         continue; 


- что не удивительно, это же пользовательская функция..

другими словами он не выдает удаленные файлы.. нужно искать другой метод.. либо тупо переписать функции поиска.. время у нас есть? 

Это сообщение отредактировал(а) fish9370 - 21.6.2011, 00:18


--------------------
undefined
PM MAIL WWW ICQ   Вверх
xvr
Дата 21.6.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Никакие стандартные функции поиска (включая и findfirst) не будут возвращать записи для удаленных файлов (и это сделано уже на уровне ОС, а не в run-time библиотеке)

Так что только напрямую потрошить диск (в DOS), или открывать директорию на чтение (CreateFile с FLAG_BACKUP_SEMANTIC - в Win) и читать. И то и другое требует недюжинных познаний во внутренних структурах файловой системы  smile 

PM MAIL   Вверх
Cybernetick
Дата 21.6.2011, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



думаю топик можно закрывать,всем спасибо за помощь) буду насиловать FAT)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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