-- started: 2022-11-22 -- http://forum.ru-board.com/topic.cgi?forum=5&topic=51024&start=360#14 if ({ far.AdvControl("ACTL_GETFARMANAGERVERSION", true) })[4] < 5443 then return end local COLNAME = "SubD" local ffi = require "ffi" local C = ffi.C local band = bit.band ffi.cdef [[ typedef struct { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; WCHAR cFileName[260]; WCHAR cAlternateFileName[14]; DWORD dwFileType; DWORD dwCreatorType; WORD wFinderFlags; } WIN32_FIND_DATAW; HANDLE FindFirstFileW(const wchar_t*, WIN32_FIND_DATAW*); BOOL FindNextFileW(HANDLE, WIN32_FIND_DATAW*); BOOL FindClose(HANDLE); int memcmp(const void*, const void*, size_t); ]] local data = ffi.new("WIN32_FIND_DATAW") local Files = function(filename) local fnameW = ffi.cast("wchar_t*", win.Utf8ToUtf16(filename.."\\*\0")) local hnd = C.FindFirstFileW(fnameW, data) local avail = 1 return function() if hnd == nil then return end while avail ~= 0 do if 0 ~= band(data.dwFileAttributes, 16) and 0 ~= C.memcmp(data.cFileName, ".\0.\0\0\0", 6) and 0 ~= C.memcmp(data.cFileName, ".\0\0\0", 4) then avail = C.FindNextFileW(hnd, data) return true end avail = C.FindNextFileW(hnd, data) end C.FindClose(hnd) end end ContentColumns { GetContentFields = function(colnames) for _,v in ipairs(colnames) do if v == COLNAME then return true end end end; GetContentData = function(filename, colnames) local attr = win.GetFileAttr(filename) if attr and attr:find("d") then local N, out = 0, {} for _ in Files(filename) do N=N+1 end for k,v in ipairs(colnames) do if v == COLNAME then out[k]=tostring(N) end end return out end end; } |