Поиск файлов в С++
Перед вами - содержимое несчастного .CPP ,
назначение которого - поиск файлов.Оно работает,
но не очень (явно потому , что я писал!):
#include <fstream.h>
#include <io.h>
void vivod(_finddata_t vfdata)
{
cout <<"file_name :"<<vfdata.name << "\n";
cout <<"atributes :"<<vfdata.attrib << "\n";
cout <<"file_size :"<<vfdata.size << "\n";
cout <<"time_access:"<<vfdata.time_access << "\n";
cout <<"time_create:"<<vfdata.time_create << "\n";
cout <<"time_write :"<<vfdata.time_write << "\n";
cout <<"-------------------------------" << "\n";
}
void main( void )
{
char *fpath = "d:\\*.txt";
long ctrl,next;
int i=1;
_finddata_t fdata;
ctrl = _findfirst(fpath,&fdata);
cout << i <<": "<<"ctrl= "<<ctrl<<"\n";
vivod(fdata);
while (next!=-1)
{
next = _findnext(ctrl,&fdata);
if (next!=-1) {
cout << ++i << ": " << "ctrl = "<< ctrl;
cout << " next = " << next << "\n";
vivod(fdata);};
}
_findclose(ctrl);
_findclose(next);
}
А вот результат :
(хотелось бы знать :
1. time_access,time_create,time_write,
ctrl - что за странные значения!?!
2. Как по значению attrib определить
какие у файла атрибуты?)
Заранее ОГРОМНОЕ спасибо!!!
1: ctrl = 6685668
file_name :file.txt
atributes :1
file_size :4
time_access :1037656800
time_create :1036944333
time_write :1037700380
-------------------------------
2: ctrl = 6685668 next = 0
file_name :he.txt
atributes :33
file_size :4
time_access :1037656800
time_create :1037722064
time_write :1037700380
-------------------------------
P.S. : если есть ещё какие-нибудь
способы поиска файлов в C++ - пишите!
Вот что я нашёл в io.h :
#define _A_NORMAL 0x00 /* Normal file */
#define _A_RDONLY 0x01 /* Read only file */
#define _A_HIDDEN 0x02 /* Hidden file */
#define _A_SYSTEM 0x04 /* System file */
#define _A_SUBDIR 0x10 /* Subdirectory */
#define _A_ARCH 0x20 /* Archive file */
Это значит , что если файл с атрибутом Archive ,то
Atributes = 32 (0x20 = 2*16 ).
А если он и системный, и архивный и ещё чёрт знает
какой - то все числа сложатся!!!!!
К примеру 35 для
Read only file + Hidden file + Archive file !
А как по этому числу (не занимаясь арифметикой
конечно же!) сразу узнать какие у файла атрибуты?!?
Пожалуйста! Помогите несчастному чайнику!
для файла:
Read only file,Hidden file,Archive file
имеем:
vfdata.attrib == _A_RDONLY | _A_HIDDEN | _A_ARCH
операция | это "или" (логическое сложение) этой операцией мы УСТАНАВЛИВАЕМ индивидуальные биты в слове.
чтобы всё это понять надо понять это в двоичной системе счисления:
в двоичном виде, attrib выглядит так:
00100011
а сама операция так:
00000001 - _A_RDONLY
00000010 - _A_HIDDEN
00100000 - _A_ARCH
--------
00100011 - attrib
важно использовать именно | а не + т.к. + может вызвать перенос, и всё испортит:
100011 - было
+ 000001
--------
100100 - результат, в то время как ожидаемый 100011
чтобы сбросить конкретный бит надо сделать "и" с не-маской:
например убрать rdonly:
vfdata.attrib = vfdata.attrib & ~_A_RDONL
где & - побитовое "И", а ~ - побитовое не (все биты инввертируются)
имеем в двоичном виде:
00100011 - наш attrib
00000001 - _A_RDONLY
11111110 - ~_A_RDONLY
операция & типа побитового умножения все что на & 1 так и останется а всё что на 0 сбросится в 0
00100011
& 11111110
----------
00100010 - новй attrib
чтобы узнать состояние бита сброшен или установлен надо сделать & с маской:
установлен ли _A_RDONLY на 00100010?
00100010 & _A_RDONLY = 0
00100010 & 00000001 = 0
а вот _A_ARCH?
00100010 & 00100000 = 00100000 то есть не 0
в общем виде имеем :
значение & маска == маска, если бит УСТАНОВЛЕН и
значение & маска == 0, если бит СБРОШЕН
значение = значение | маска - это установка бита
значение = значение & ~маска - это сброс бита
касаемо твоих файлов:
cout << "\nHidden: " << ((vfdata.attrib & _A_HIDDEN) ? "yes" : "no";
cout << "\nRdOnly: " << ((vfdata.attrib & _A_RDONLY) ? "yes" : "no";
и т.д.
подробное изложение материала!!!
Всё мгновенно стало ясно!!!
Единственное , что меня напрягает ,
так это значения
time_access,time_create,time_write.
По идее это какой-то формат времени,
но в MSDN ничего такого не сказано!
(Во всяком случае в описании
_finddata_t ).
Жаль тут нет 50-го шрифта,
как в WORD'e!!!
А то бы я написал это покрупнее!
По time_t в MSDN подробнейшая справка
с гигантским примером по всем форматам!!!
:D :D :D