Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851

Есть класс для работы с каталогами, быстрее ли будет с классом string

25.09.2021, 12:42. Показов 1645. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс для работы с каталогами, быстрее ли будет работать с классом string.

Стоит ли переделывать класс и также структуру в классе для работы с string.
Это вопрос о скорости и эффективности.

h файл.
Кликните здесь для просмотра всего текста
C++
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
#include <vector>
 
class WorkWithDir
{
private:
    HANDLE hFind;
 
    WIN32_FIND_DATAW wfd;
    //SYSTEMTIME st;
 
    // Структура информации о файле.
    struct fileStructInfo
    {
        DWORD dwFileAttribute;
        SYSTEMTIME stCreationTime;
        SYSTEMTIME stLastAccessTime;
        SYSTEMTIME stLastWriteTime;
        ULONGLONG nFileSize;
        DWORD dwReserved0;
        WCHAR cFileName[MAX_PATH];
        WCHAR cAlternateFileName[14];
    };
 
    unsigned int sizeArrfiles; // количество файлов каталоге.
    unsigned int sizeArrdir; // количество каталогов в каталоге.
    unsigned int dir = 0, files = 0;
    unsigned int indexfile = 0, indexdir = 0; // количество файлов во временном массиве структур.
 
    std::vector<fileStructInfo> dirVec; // Вектор структур  информации о каталогах и файлах.
    std::vector<fileStructInfo> filesVec; // Вектор структур  информации о файлах.
 
public:
    wchar_t pathDirectory[MAX_PATH]; // путь к каталогу.
    std::vector<fileStructInfo> dirfilesVec; // Вектор структур  информации о каталогах и файлах.
 
    void createFilesArray();
    void setStartDir(WCHAR *dir);
    void setRootDirectory();
    void getDirectory();
    void setDirectory();
    void upDirectory(wchar_t *pszDirPath);
    void downDirectory();
    //void setArrayOfFiles();
    void readDirectoryInfilesArray();
    LPWSTR SetFullPath(wchar_t *pszfileName);
};

cpp файл.
Кликните здесь для просмотра всего текста
C++
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#define _CRT_SECURE_NO_WARNINGS
#pragma once
 
#define UNICODE
#define _UNICODE
 
#include <Windows.h>
#include <tchar.h>
#include <iostream>
#include <vector>
#include "workWithDir.h"
 
// Структуры информации о файле.
/*typedef struct _WIN32_FIND_DATA
{
  DWORD    dwFileAttributes;       // атрибуты файла
  FILETIME ftCreationTime;         // время создания файла
  FILETIME ftLastAccessTime;       // время доступа
  FILETIME ftLastWriteTime;        // время записи
  DWORD    nFileSizeHigh;     // размер файла (старшее слово)
  DWORD    nFileSizeLow;      // размер файла (младшее слово)
  DWORD    dwReserved0;            // зарезервировано
  DWORD    dwReserved1;            // зарезервировано
  TCHAR    cFileName[MAX_PATH];    // имя файла
  TCHAR    cAlternateFileName[14]; // альтернативное имя файла
} WIN32_FIND_DATA*/
 
//  Вычислить размеры вектора структур файлов.
void WorkWithDir::createFilesArray()
{
sizeArrfiles = 0;
hFind = FindFirstFileW(pathDirectory, &wfd);
setlocale(LC_ALL, "");
if (INVALID_HANDLE_VALUE != hFind)
{
    do
    {
        if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        sizeArrdir++;
        else
        sizeArrfiles++;
    }while (NULL != FindNextFileW(hFind, &wfd));
                FindClose(hFind);
    }
        dirVec.resize(sizeArrdir);
        filesVec.resize(sizeArrfiles);
}
 
// установить стартовую директорию.
void WorkWithDir::setStartDir(WCHAR *dir)
{
    wchar_t *pstr = pathDirectory; *pstr = 0;
    wcscat(pathDirectory, dir);
    wcscat(pathDirectory, L"*.*\0");
    SetCurrentDirectoryW(pathDirectory);
}
 
// Получить текущую директорию.
void WorkWithDir::getDirectory()
{
    GetCurrentDirectoryW(sizeof(pathDirectory), pathDirectory);
}
 
// установить текущую директорию.
void WorkWithDir::setDirectory()
{
    SetCurrentDirectoryW(pathDirectory);
}
 
// Перейти в корневую директорию.
void WorkWithDir::setRootDirectory()
{
    wchar_t *pstr = pathDirectory; pstr++ ; *pstr = 0;
    wcscat(pathDirectory, L":\\*.*");
    SetCurrentDirectoryW(pathDirectory);
}
 
// Перейти по директории в верх.
void WorkWithDir::upDirectory(wchar_t *pszDirPath)
{
    wchar_t *pstr = pathDirectory + wcslen(pathDirectory); pstr = pstr - 3; *pstr = 0;   
    wcscat(pathDirectory, pszDirPath); wcscat(pathDirectory, L"\\*.*\0");
    SetCurrentDirectoryW(pathDirectory);
}
 
// Перейти по директории в низ.
void WorkWithDir::downDirectory()
{
    wchar_t *pstr = pathDirectory + wcslen(pathDirectory);
    while(*pstr != L'\\') { --pstr; }; *pstr = 0; while(*pstr != L'\\') { --pstr; }; ++pstr; *pstr = 0;
    wcscat(pathDirectory, L"*.*\0"); SetCurrentDirectoryW(pathDirectory);
}
 
// Прочитать содержимое директории в вектор структур, с предварительным вычислением размера вектора.
void WorkWithDir::readDirectoryInfilesArray()
{
    dirfilesVec.clear();
    sizeArrfiles = 0, sizeArrdir = 0;
    hFind = FindFirstFile(pathDirectory, &wfd);
 
    setlocale(LC_ALL, "");
    if(INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            sizeArrdir++;
            else
            sizeArrfiles++;
        }while (NULL != FindNextFile(hFind, &wfd));
                FindClose(hFind); 
    }
 
    dirVec.resize(sizeArrdir);
    filesVec.resize(sizeArrfiles);
    //g_dirfilesVec.resize(sizeArrdir + sizeArrfiles);
 
    indexfile = 0, indexdir = 0;
    hFind = FindFirstFile(pathDirectory, &wfd);
    setlocale(LC_ALL, "");
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
            dirVec[indexdir].dwFileAttribute = wfd.dwFileAttributes;
            FileTimeToSystemTime(&wfd.ftCreationTime, &dirVec[indexdir].stCreationTime);
            FileTimeToSystemTime(&wfd.ftLastAccessTime, &dirVec[indexdir].stLastAccessTime);
            FileTimeToSystemTime(&wfd.ftLastWriteTime, &dirVec[indexdir].stLastWriteTime);
            {
            dirVec[indexdir].nFileSize = (wfd.nFileSizeHigh * (MAXDWORD+1)) + wfd.nFileSizeLow;
            }
            dirVec[indexdir].dwReserved0 = wfd.dwReserved0;
            wcscat(wcscpy(dirVec[indexdir].cFileName, wfd.cFileName), _TEXT("\0"));
            wcscat(wcscpy(dirVec[indexdir].cAlternateFileName, wfd.cAlternateFileName), _TEXT("\0"));
            indexdir++;
            dir++;
            }
            else
            {
            filesVec[indexfile].dwFileAttribute = wfd.dwFileAttributes;
            FileTimeToSystemTime(&wfd.ftCreationTime, &filesVec[indexfile].stCreationTime);
            FileTimeToSystemTime(&wfd.ftLastAccessTime, &filesVec[indexfile].stLastAccessTime);
            FileTimeToSystemTime(&wfd.ftLastWriteTime, &filesVec[indexfile].stLastWriteTime);
            {
            filesVec[indexfile].nFileSize = (wfd.nFileSizeHigh * (MAXDWORD+1)) + wfd.nFileSizeLow;
            }
            filesVec[indexfile].dwReserved0 = wfd.dwReserved0;
            wcscat(wcscpy(filesVec[indexfile].cFileName, wfd.cFileName), _TEXT("\0"));
            wcscat(wcscpy(filesVec[indexfile].cAlternateFileName, wfd.cAlternateFileName), _TEXT("\0"));
            indexfile++;
            files++;
            }
        }while (NULL != FindNextFile(hFind, &wfd));
                FindClose(hFind); 
    }
    dirVec.insert(dirVec.end(), filesVec.begin(), filesVec.end());
    dirfilesVec.insert(dirfilesVec.end(), dirVec.begin(), dirVec.end());
    dirVec.clear(); filesVec.clear();
}
 
LPWSTR WorkWithDir::SetFullPath(wchar_t *pszfileName)
{
    wchar_t pszfullPath[MAX_PATH];
    //wchar_t fileName[MAX_PATH];
    wcscpy(pszfullPath, pathDirectory);
    wchar_t *pstr = pszfullPath + wcslen(pszfullPath);
    short index = 0; while(*pstr != L'\\') { --pstr; }; ++pstr; *pstr = 0;
    wcscpy(pszfullPath, pszfileName);
    return pszfullPath;
}
 
/*  // Прочитать содержимое директории в вектор структур.
    void workFromDir::setArrayOfFiles()
    {
    indexfile = 0;
    hFind = FindFirstFileW(pathDirectory, &wfd);
    setlocale(LC_ALL, "");
    if (INVALID_HANDLE_VALUE != hFind)
        {
        do
        {
            g_filesArray[indexfile].dwFileAttribute = wfd.dwFileAttributes;
            g_filesArray[indexfile].dwReserved0 = wfd.dwReserved0;
            FileTimeToSystemTime(&wfd.ftCreationTime, &g_filesArray[indexfile].stCreationTime);
            FileTimeToSystemTime(&wfd.ftLastAccessTime, &g_filesArray[indexfile].stLastAccessTime);
            FileTimeToSystemTime(&wfd.ftLastWriteTime, &g_filesArray[indexfile].stLastWriteTime);
            {
            g_filesArray[indexfile].nFileSize = (wfd.nFileSizeHigh * (MAXDWORD+1)) + wfd.nFileSizeLow;
            }
            wcscat(wcscpy(g_filesArray[indexfile].cFileName, wfd.cFileName), L"\0");
            wcscat(wcscpy(g_filesArray[indexfile].cAlternateFileName, wfd.cAlternateFileName), L"\0");
            indexfile++;
        } while (NULL != FindNextFileW(hFind, &wfd));
                FindClose(hFind);
                }
    }*/

Я не программист, так что за код сильно не ругайте.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.09.2021, 12:42
Ответы с готовыми решениями:

Разработать класс String, который в дальнейшем будет использоваться для работы со строками
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; using namespace std; class string_ { char *s; ...

Разработать класс String, который в дальнейшем будет использоваться для работы со строками
Всем доброго времени суток! Вот задание: Разработать класс String, который в дальнейшем будет использоваться для работы со...

Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Всем доброго времени суток! Помогите пожалуйста т.к я не очень понимаю задание, что от меня требуется, распишите по пунктам, что мне...

7
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
25.09.2021, 13:55
DenAlpetyan, скорость будет такая же. Удобство и безопасность будут намного выше

инициализацию полей ещё неплохо бы добавить

Добавлено через 2 минуты
структура WIN32_FIND_DATA уже определена в WINAPI, зачем ещё велосипедить :
Цитата Сообщение от DenAlpetyan Посмотреть сообщение
// Структура информации о файле.
    struct fileStructInfo
разве что, как раз, написать её на C++ с использованием std::string

Добавлено через 1 минуту
Цитата Сообщение от DenAlpetyan Посмотреть сообщение
#pragma once
это не должно быть в cpp, это должно быть в начале заголовка
1
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
25.09.2021, 16:06  [ТС]
Алексей1153,

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Сообщение от DenAlpetyan
#pragma once
это не должно быть в cpp, это должно быть в начале заголовка
В смысле в главном файле ?

Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
DenAlpetyan, скорость будет такая же. Удобство и безопасность будут намного выше
Конвертирование в string и обратно много занимает ?

Добавлено через 20 минут
Цитата Сообщение от DenAlpetyan Посмотреть сообщение
#pragma once
это не должно быть в cpp, это должно быть в начале заголовка
В h файле ?
0
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
25.09.2021, 16:26
взгляд упал сюда и сразу что-то не то:
Цитата Сообщение от DenAlpetyan Посмотреть сообщение
LPWSTR WorkWithDir::SetFullPath(wchar_t *pszfileName)
{
    wchar_t pszfullPath[MAX_PATH];
    //wchar_t fileName[MAX_PATH];
    wcscpy(pszfullPath, pathDirectory);
    wchar_t *pstr = pszfullPath + wcslen(pszfullPath);
    short index = 0; while(*pstr != L'\\') { --pstr; }; ++pstr; *pstr = 0;
    wcscpy(pszfullPath, pszfileName);
    return pszfullPath;
}
DenAlpetyan, как это вы тут локальную pszfullPath выдаёте в наружу? Разве тут не UB?

Цитата Сообщение от DenAlpetyan Посмотреть сообщение
Есть класс для работы с каталогами, быстрее ли будет с классом string
смело переводите на <string>.
в С++17 для этого даже специальные штуки есть, типа std::string_view + приёмчики разные ...

скорость будет выше, ибо не надо будет такую wcslen-хрень делать...
1
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
25.09.2021, 16:53  [ТС]
XLAT,

Цитата Сообщение от XLAT Посмотреть сообщение
DenAlpetyan, как это вы тут локальную pszfullPath выдаёте в наружу? Разве тут не UB?
Я эту функцию еще не дописал.

У меня MV Studio Express 2015, не знаю что там с C++ 17.

Добавлено через 4 минуты

Не по теме:

Ха - Ха, 2015 C++ 17.

0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
25.09.2021, 17:23
Цитата Сообщение от DenAlpetyan Посмотреть сообщение
В смысле в главном файле
в смысле - ВО ВСЕХ заголовочных файлах, самой первой строкой. В файлах реализации - НЕ НАДО

Добавлено через 1 минуту
Цитата Сообщение от DenAlpetyan Посмотреть сообщение
Конвертирование в string и обратно много занимает
нет конвертирования - будет копирование, причём очень прозрачное. А в обратную сторону не будет ни конвертирования, ни копирования - можно просто указатель наружу выдать .c_str()
1
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
25.09.2021, 18:07
Цитата Сообщение от DenAlpetyan Посмотреть сообщение
Я эту функцию еще не дописал.
C++
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
///----------------------------------------------------------------------------|
/// ...
///----------------------------------------------------------------------------:
#include <iostream>
#include <string>
#include <windows.h>
 
#define  l(v) std::wcout << #v << " = " << (v) << "\n";
 
wchar_t pathDirectory[] = {L"C:\\aaa\\bbb"};
 
std::wstring SetFullPath(std::wstring_view fileName)
{   std::wstring fullPath(pathDirectory);
    auto p     = fullPath.rfind('\\');
                 fullPath.resize  (p);
    return       fullPath += fileName;
}
 
///----------------------------------------------------------------------------|
/// Start.
///----------------------------------------------------------------------------:
int main()
{
    wchar_t pszfileName[] = {L"my.txt"};
    
    l(SetFullPath(pszfileName))
}
1
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
25.09.2021, 18:38  [ТС]
Алексей1153,

Там обратно наверно и не нужно особо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.09.2021, 18:38
Помогаю со студенческими работами здесь

Создать класс для работы коллекцией Dictionary<string, string>
Создать класс для работы со словарем Dictionary&lt;string, string&gt;. Ключ представляет собой символьное число из пяти цифр, а значением...

Создать класс String для работы со строками
здравствуйте) напишите пжлста програмку: Пояснение к заданию: Во всех заданиях необходимо реализовать конструктор инициализации (один...

Создать класс String для работы со строками
Создать класс String для работы со строками,аналогичными строкам Turbo Pascal (строка представляется как массив 255 байт,длина-первом...

Разработать класс String для работы со строками
разработать класс String для работы со строками. Класс должен содержать контср по умолчанию, контсруктор копирования. Перегрузить в этом...

Разработать класс String для работы со строками
/*Разработать класс String для работы со строками. Класс должен содержать: - Конструктор по умолчанию, позволяющий создать строку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru