Здорова господа!!!
Мне в общем понадобилось прочитать все имена файлов из директории. Да в пхп это делалось легко, просто использовал функцию scandir() которой передавал путь к директории и на выходе получал массив с именами файлов, но увы в С++ все намного сложнее, именно под виндовс это все делается с помощью ВИНАПИ.
Ну в общем не охота мне расписывать, что да как работает, вот смотрите просто готовый код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#include <iostream> using std::cout; using std::cerr; using std::wcout; using std::endl; #include <string> using std::string; using std::wstring; #include <vector> using std::vector; #include <fstream> using std::ofstream; using std::wofstream; using std::ifstream; using std::wifstream; #include <cstdlib> using std::exit; #include <windows.h> wstring string_to_wstring(string& s) { ofstream ofs("temp.txt",ofstream::out); if(!ofs){cerr <<"don't open file: 'temp.txt1' "<<endl;exit(1);} ofs <<s; ofs.close(); wstring s1; wifstream wifs("temp.txt",wifstream::in); if(!wifs){cerr <<"don't open file: 'temp.txt2'"<<endl;exit(1);} wifs >>s1; wifs.close(); return s1; } string wstring_to_string(wstring s) { wofstream wofs("temp.txt",wofstream::out); if(!wofs){cerr <<"don't open file: 'temp.txt3'"<<endl;exit(1);} wofs <<s; wofs.close(); string s1; ifstream ifs("temp.txt",ifstream::in); if(!ifs){cerr <<"don't open file: 'temp.txt3'"<<endl;exit(1);} ifs >>s1; ifs.close(); return s1; } vector<string> scandir(string p) { wstring Path=string_to_wstring(p); WIN32_FIND_DATA FindFileData; HANDLE hf; hf=FindFirstFile((string_to_wstring(p)).c_str(),&FindFileData); vector<string> v; if(hf!=INVALID_HANDLE_VALUE) { do { wcout <<"FindFileData.dwFileAttributes= "<<FindFileData.dwFileAttributes<<endl; if(FindFileData.dwFileAttributes!=FILE_ATTRIBUTE_DIRECTORY) v.push_back(wstring_to_string(FindFileData.cFileName)); } while(FindNextFile(hf,&FindFileData)!=0); } return v; } int main() { vector<string> v; v=scandir("C:\\*"); for(int i=0;i<v.size();i++) cout <<v[i]<<endl; return 0; } |
В нем я создал несколько функций: wstring_to_string(), string_to_wstring() и scandir(). Просто захотел сделать так сказать инструменты. Первые две функции они просто преобразуют широкие строки в обычные строки и наоборот. Способ которым я преобразую это просто данные сохраняю в файл, а затем считываю в нужном мне потоке по другому я не знаю как можно еще сделать это преобразование без копирования во временный файл. Функция сама scandir() принимает путь к директори и возвращает массив-вектор со строками названий файлов в директории, в данном примере мы читаем файлы по пути С:\\* , звездочка означает все файлы, увы такая комбинация как C:\\*.* почему то не работает, поэтому я явно проверяю в функции параметр атрибут файла. Данная программа выведет еще и каталоги системные. В ОС виндовс каталоги которые использует система они не считаются обычными каталогами, они имеют свой атрибут, это все расписано в МСДН, ну его правда трудно читать без знаний английского, да в принципе можно читать со скудными знаниями английского, это как например я читаю cplusplus.com, я просто его использую как справочник, просто С++ знаю и знаю саму структуру cplusplus.com, поэтому мне не сложно найти нужную функцию.
Увы с МСДН такой номер не катить, нет предварительной подготовки в виде прочтения одной — двух русскоязычных книг по программированию в виндовс, а без этого конечно ничего не разберешь, потому что даже саму структуру МСДН не знаешь, имеется в веду набор функций, ее возможности.
Ладно то что я хотел сделал, функции работают, возможно есть лучший способ перевода wstring в string, возможно вообще можно обойтись без перевода, просто проект правильно настроить, но увы я это пока еще не знаю, для меня это темный лес. Ок будем потихоньку разгадывать эту замечательную, таинственную ОС Windows (Windosw ForEveR) !!!!
[youtube]http://www.youtube.com/watch?v=dGqpq9H0zKM[/youtube]
Используемый DIR формат даты и времени зависит от установки страны в файле CONFIG.SYS. Если команда COUNTRY не используется, форматы соответствуют форматам США.