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

Краш при получении расширения файла

19.02.2020, 22:16. Показов 653. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
пишу поиск файлов по определенным расширениям. ВАЖНО: пишу без зависимости CRT, поэтому предлагать только нативные решения. нужно отсеять по нескольким расширениям. вот код, который у меня сейчас:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wchar_t filePath[MAX_PATH]; // массив под путь до файла
 
                lstrcpyW(filePath, a); // копирую путь до файла в массив
                lstrcatW(filePath, data_file.cFileName); // добавляю к массиву название файла
 
                int pos = findchr(data_file.cFileName, L"."); // нахожу позицию точки
 
                LPCWSTR fileName = data_file.cFileName; // определяю строку как название файла
 
                if (pos != -1) { // если точка была вообще найдена
                    BYTE* out = (BYTE*)HeapAlloc(GetProcessHeap(), NULL, lstrlenW(fileName) - pos - 1); // создаю массив размером с расширение
 
                    findExtension(fileName, pos, out); // тут небольшой цикл, который из название файла начиная с позиции точки отправляет по символу расширение в массив
 
                    LPWSTR extension = S2W(byte2ch(out, lstrlenW(fileName) - pos - 1)); // преобразование строки из массива байтов в юникод строку
                    HeapFree(GetProcessHeap(), NULL, out); // освобождение памяти
                }
findExtension:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void findExtension(LPCWSTR fileName, int pos, BYTE* ext)
{
    if (pos != -1) 
    {
        int lenght = lstrlenW(fileName);
        
        for (int i = 0; i < lenght - pos; i++)
        {
            ext[i] = fileName[pos + 1 + i];
        }
    }
}
краш происходит именно в этой функции... а в чем проблема?

ровно такой же код в другом проекте с поддержкой CRT:
C++
1
2
3
4
5
6
7
8
9
10
LPCWSTR filename = L"BOOTNXT.txt";
    int pos = findchr(filename, L".");
 
    BYTE* out = (BYTE*)HeapAlloc(GetProcessHeap(), NULL, lstrlenW(filename) - pos - 1);
 
    findExtension(filename, pos, out);
 
    LPCWSTR extension = s2ws(byte2ch(out, lstrlenW(filename) - pos - 1)).c_str();
    HeapFree(GetProcessHeap(), NULL, out);
    MessageBoxW(NULL, extension, NULL, SW_SHOW);
выводит сообщение с содержанием: txt

Добавлено через 26 минут
Сошелся на функции PathFindExtensionW из библиотеки shlwapi.h
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2020, 22:16
Ответы с готовыми решениями:

Ошибка при получении владельца файла
setlocale(LC_ALL, &quot;ru&quot;); HANDLE hFile = CreateFile(L&quot;file.exe&quot;, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,...

Баг сервера при получении файла больше ~2.26гб файла. (Сокеты)
Помогите найти в чем проблема. Почему то сервер, когда количество принятых байт доходит до 2.26 гб, делает все последующие отрецательными в...

Ошибка при получении размера файла
Не могу разобраться , в чем причина ошибки. Есть часть кода. Прога следит за файлами в дириктории и далее в лист выводит инфо о них. На...

2
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.02.2020, 10:09
Цитата Сообщение от korozyan Посмотреть сообщение
краш происходит именно в этой функции... а в чем проблема?
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
LPCWSTR findExtension(LPCWSTR fileName, LPCWSTR &ext2)
{
    int lenght = lstrlenW(fileName);
    if (lenght == 0)
        return ext2 = fileName;
 
    ext2 = fileName + lenght;
    for (LPCWSTR p = ext2 - 1; p >= fileName; --p)
        if (*p == L'.')
            return p + 1;
 
    return ext2;
}
 
............
 
LPCWSTR ext2;
LPCWSTR ext = findExtension(fileName, ext2);
LPWSTR out = nullptr; 
 
const size_t ln = ext2 - ext;
if (ln != 0)
{
    out = (LPWSTR)::HeapAlloc(GetProcessHeap(), NULL, (ln + 1) * sizeof(*ext));
    memcpy(out, ext, ln * sizeof(*ext));
    out[ln] = 0;
}
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,912
20.02.2020, 16:54
Что-то странные манипуляции какие-то используете. А что, стандартных функций не хватило?
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
#include <stdio.h>
#include <string.h>
#include <wchar.h>
#include <limits.h>
#include <locale.h>
 
#ifdef WIN32 /*костыль для winapi, которая не хочет по-человечески выводить юникод*/
  #include <windows.h>
  #include "fcntl.h"
  __attribute__((constructor)) void coninit(){
    SetConsoleCP(CP_UTF8); SetConsoleOutputCP(CP_UTF8);
    _setmode(_fileno(stdout), _O_U8TEXT);
    _setmode(_fileno(stdin), _O_U8TEXT);
  }
#endif
 
int main(int argc, char **argv){
  setlocale(LC_ALL, ""); //раз уж используем wchar_t, почему бы не включить его в консоли
  wchar_t filePath[PATH_MAX];
  
  wscanf(L"%ls", filePath); //ввод строки с именем файла
  
  wchar_t *dot = NULL;
  dot = wcsrchr(filePath, L'.'); //поиск самой правой точки
  wprintf(L"[%ls]\n", dot); //вывод
Code
1
2
3
4
$ gcc main.c
$ ./a.out 
arfgedf/asdfvsv/awrfe.a
[.a]
Правда, если точка содержится в имени каталога, но не в имени файла... впрочем, исправить это нетрудно:
Code
1
2
3
$ ./a.out 
gbf.edvgv/ff
[.edvgv/ff]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2020, 16:54
Помогаю со студенческими работами здесь

Зависает клиент при получении файла
часть сервера public void getFile(string name) { FileStream fstFile = new FileStream(name,...

Зацикливание при получении получении сообщения от клиента
Доброго времени суток! Уже выбился из сил... Суть моей проблемы в следующем. Реализую клиент-серверное приложение на сокетах. Сервер...

Getfilesize: при получении размеров файла программа рушится
Здравствуйте. помогите пожалуйста разобраться: задание: используя функции WinApi, получить размер файла, заданного в командной строке. ...

Как при получении Workbook Excel не обновлять связи файла
Получаю объект: Dim objDWE As Object objDWE = GetObject(strPTmp &amp; &quot;TempPas.xls&quot;)Но этот объект содержит связи и выводится запрос об их...

Ошибка при получении файла с FTP на Windows если он находится в папке с названием на кириллице
ДОбрый день. У заказчика возникла нужда получать файлы с его ФТП, при чем файлы лежат в папках с названием типа &quot;2015-10-21...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru