Вопрос Съедание части названий файлов при поиске через WinAPI

хочу кекать!
Начинающий
Статус
Оффлайн
Регистрация
13 Июн 2020
Сообщения
148
Реакции[?]
-42
Поинты[?]
2K
Нужна помощь, прям пипец.

Файлы находит, но сжирает половину названия.

Например:
Preset.json -> et.json

code_language.lua:
if not pcall(ffi.sizeof, 'WIN32_FIND_DATAA') then
    ffi.cdef[[
        typedef struct _WIN32_FIND_DATAA {
            uint32_t dwFileAttributes;
            uint64_t ftCreationTime;
            uint64_t ftLastAccessTime;
            uint64_t ftLastWriteTime;
            uint32_t nFileSizeHigh;
            uint32_t nFileSizeLow;
            uint32_t dwReserved0;
            uint32_t dwReserved1;
            char     cFileName[260];
            char     cAlternateFileName[14];
        } WIN32_FIND_DATAA, *PWIN32_FIND_DATAA;

        void* FindFirstFileA(const char* lpFileName, PWIN32_FIND_DATAA lpFindFileData);
        bool FindNextFileA(void* hFindFile, PWIN32_FIND_DATAA lpFindFileData);
        bool FindClose(void* hFindFile);
    ]]
end

function parseFiles(folderPath)
    local jsonFiles = {}
    local findData = ffi.new('WIN32_FIND_DATAA')
    local searchPath = folderPath .. '\\*.json'
    local searchHandle = ffi.C.FindFirstFileA(searchPath, findData)

    if searchHandle == ffi.cast('void*', -1) then
        print('No files found or error in directory path:', folderPath)
        return jsonFiles
    end

    repeat
        local fileName = ffi.string(findData.cFileName)

        if fileName:match('%.json$') then
            table.insert(jsonFiles, folderPath .. '\\' .. fileName)
        end
    until not ffi.C.FindNextFileA(searchHandle, findData)

    ffi.C.FindClose(searchHandle)

    return jsonFiles
end
 
Femboy Access
Эксперт
Статус
Оффлайн
Регистрация
11 Ноя 2020
Сообщения
1,333
Реакции[?]
428
Поинты[?]
96K
попробуй вайд стринги (и соответственно, метод который кончается на W)
 
Nike.lua
Олдфаг
Статус
Оффлайн
Регистрация
13 Окт 2020
Сообщения
2,747
Реакции[?]
1,465
Поинты[?]
2K
code_language.lua:
parser.update_entries = function( self, folder_path, extension )
    folder_path = string.format( "%s\\*", folder_path );

    local invalid_handle = ffi.cast( "void*", -1 );
    local win32_find_data_a = ffi.new( "WIN32_FIND_DATA_A[1]" );
  
    local entry = ffi.C.FindFirstFileA( folder_path, win32_find_data_a );
    if entry ~= invalid_handle then
        repeat
            local filename = ffi.string( win32_find_data_a[ 0 ].cFileName );
            if filename:find( string.format( ".%s", extension ) ) then
                local attributes = win32_find_data_a[ 0 ].dwFileAttributes;
                if not bit.band( attributes, FILE_ATTRIBUTE_HIDDEN ) and not bit.band( attributes, FILE_ATTRIBUTE_DIRECTORY ) then
                    filename = filename:substr(0, #filename - ( #extension + 1 ) );
                    table.insert(
                        self.last_parsed_data,
                        filename
                    );
                end
            end
        until ffi.C.FindNextFileA( entry, win32_find_data_a ) == 0;
    end
  
    ffi.C.FindClose( entry );
end
 
Сверху Снизу