Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2011, 17:30   #1
Ksardas13
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 120
Восклицание Выводим содержимое папки - ПРОБЛЕМА с атрибутами

Операционка на которой тестирую Windows7. Функция приведена ниже.
При проверки с помощью неё моей флешки - отображает нормально какой элемент является файлом, а какой папкой. А в случае если заползти в какой нибудь локальный диск С или Д - некоторые элементы упорно считает файлами, хотя они являются папками!!! Вроде ошибка, если она есть, должна быть в этой процедуре, ибо входные данные и выходные соответствуют требованиям(кроме её ошибочных предположений).
В чём может быть дело?
Щас пока поползу гуглить на тему атрибутов файлов и как с ними работать.
Цитата:
AnsiString file_in_directory(AnsiString patch)
{
WIN32_FIND_DATA our_file;
HANDLE f;
AnsiString otvet="";
patch+="*.*";
f=FindFirstFile(patch.c_str(),&our_ file);
if(f!=INVALID_HANDLE_VALUE)
do {
//data="f|565|file1|Скрытый|p|papka1| Скрытый|"-образец результата
if (our_file.dwFileAttributes==FILE_AT TRIBUTE_DIRECTORY) otvet=otvet+"p|";//если папка - пишем p
else otvet=otvet+"f|"+AnsiString((our_fi le.nFileSizeHigh * MAXDWORD) + our_file.nFileSizeLow)+"|";//если файл пишем f и его размер
otvet=otvet+our_file.cFileName+"|";//добавляем имя
switch (our_file.dwFileAttributes)//теперь атрибут
{
//case (FILE_ATTRIBUTE_DIRECTORY): otvet+="папка|";break;//ноу коментс... гуглю на это счёт
case (FILE_ATTRIBUTE_HIDDEN): otvet+="HIDDEN|";break;
case (FILE_ATTRIBUTE_NORMAL): otvet+="NORMAL|";break;
case (FILE_ATTRIBUTE_NOT_CONTENT_INDEXED ): otvet+="NOT_CONTENT_INDEXED|";break ;
case (FILE_ATTRIBUTE_ARCHIVE): otvet+="ARCHIVE|";break;
case (FILE_ATTRIBUTE_OFFLINE): otvet+="OFFLINE|";break;
case (FILE_ATTRIBUTE_READONLY): otvet+="READONLY|";break;
case (FILE_ATTRIBUTE_SYSTEM): otvet+="SYSTEM)|";break;
case (FILE_ATTRIBUTE_TEMPORARY): otvet+="TEMPORARY|";break;
default: otvet+=" ? |";
}
} while(FindNextFile(f,&our_file));
FindClose(f);
return otvet;
}
ps: а у некоторых элементов атрибуты вообще не распознаёт(прыгает на строчку default, даже когда первая строка свича незакоментированна). Есть какие нибудь советы или предположения?

Последний раз редактировалось Ksardas13; 29.04.2011 в 18:27.
Ksardas13 вне форума Ответить с цитированием
Старый 29.04.2011, 18:12   #2
Ksardas13
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 120
По умолчанию

Упрощаю ещё сильней:
Цитата:
AnsiString file_in_directory2(AnsiString patch)
{
WIN32_FIND_DATA our_file;
HANDLE f;
AnsiString otvet="";
patch+="*.*";
f=FindFirstFile(patch.c_str(),&our_ file);
if(f!=INVALID_HANDLE_VALUE)
do {if (our_file.dwFileAttributes==FILE_AT TRIBUTE_DIRECTORY) otvet=otvet+"p|";
else otvet=otvet+"f|"+AnsiString((our_fi le.nFileSizeHigh * MAXDWORD) + our_file.nFileSizeLow)+"|";
otvet=otvet+our_file.cFileName+"||| |||||";
} while(FindNextFile(f,&our_file));
FindClose(f);
return otvet;
}
кнопка на форме:
Цитата:
Memo2->Lines->Add(file_in_directory2("D:\\"));
результат работы в Мемо2:
Цитата:
f|0|$RECYCLE.BIN||||||||p|Dragon Age - Origins||||||||f|528|MediaID.bin||| |||||f|0|System Volume Information||||||||f|0|Upload|||||| ||f|0|АЛЕКСЕЙ-ПК||||||||f|0|Для заливки||||||||
Но "Для заливки" и "Upload" это папки!... Такиеже фейлы с определёнными папками оно творит в диске С. Зато на флешке всё цивильно находит и определяет.
Хелп! Энибади!

PS: начал понимать, что не правильно работаю с our_file.dwFileAttributes. Кто подскажет как правильно это делать?

Последний раз редактировалось Ksardas13; 29.04.2011 в 18:28.
Ksardas13 вне форума Ответить с цитированием
Старый 29.04.2011, 18:35   #3
Dayman
Форумчанин
 
Аватар для Dayman
 
Регистрация: 12.01.2011
Сообщений: 186
По умолчанию

Я конечно не эксперт по WinApi, но мне кажется
Код:
do {if (our_file.dwFileAttributes==FILE_AT TRIBUTE_DIRECTORY) otvet=otvet+"p|";
надо заменить на
Код:
do {if (our_file.dwFileAttributes&FILE_AT TRIBUTE_DIRECTORY) otvet=otvet+"p|";
Иначе получается, что вы проверяете имеет ли файл/директория ТОЛЬКО атрибут директории.
$RECYCLE.BIN и System Volume Information гарантированно имеют больше одного атрибута.
Lingua c++ non penis caninus est.
Dayman вне форума Ответить с цитированием
Старый 29.04.2011, 19:01   #4
Ksardas13
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 120
По умолчанию

Да-да, наконец наткнулся на статью, которая объяснила что такое атрибуты и как их "смотреть". Dayman, всё верно, именно в условии if я и ошибался. Спасибо.

Статья благодаря которой я убедился в своей убогости лежит тут, если кому ещё понадобится:
http://lazy-student.org.ua/programmi...chast-vtoraya/
Ksardas13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести содержимое папки в cmd (с исключнием) ХреновыйПрогер Операционные системы общие вопросы 1 05.12.2010 19:06
Выводим на печать содержимое DBGrid Dux БД в Delphi 14 07.05.2010 22:06
скопировать все содержимое папки в другую DannyKing Помощь студентам 6 27.03.2009 09:50
Как получить содержимое папки ? - fenix - Помощь студентам 4 19.04.2008 06:25