Страницы

Поиск по вопросам

суббота, 27 октября 2018 г.

Поиск файла по расширению C++

Нужно найти файл по расширению в известной директории. Для винды существует такое решение:
FindFirstFile("Some/Directory/Some/*.some");
А как такое же провернуть под Linux, ибо подход описанный выше не работает и не заработает в Linux. Уже имеется вот такой код:
cout << "Type path - "; string path_to; getline(cin, path_to); cout << "Type filename - "; string filename; getline(cin, filename); string result = path_to + "/" + filename; FindFirstFile(result);//знаю, что другое что-то использовать нужно вот и спрашиваю.
Вчера начал изучать C++ после C#, объясните простым языком


Ответ

В С++17 появился новый крутой инклюд для работы с файловой системой:
Им и воспользуйтесь.
Код ниже делает поиск непосредственно в выбранной папке, без подпапок. Если нужен рекурсивный поиск, замените directory_iterator на recursive_directory_iterator
#include #include #include #include
namespace fs = std::filesystem; // Чтобы не писать `std::filesystem` каждый раз
int main() { std::string directory_name = "some/directory"; std::string extension = ".ext";
try // Может быть исключение, например, если папки не существует { for (auto &p : fs::directory_iterator(directory_name)) // Для всех файлов в папке { if (!fs::is_regular_file(p.status())) continue; // Пропускаем, если это не простой файл, а папка или что-то другое
std::string name(p.path().filename());
// Проверяем, что имя заканчивается нужным расширением // В С++20 можно будет просто `bool match = name.ends_with(extension);` bool match = !name.compare(name.size() - extension.size(), extension.size(), extension); if (!match) continue;
// Тут делаем с путем то, что нужно std::cout << name << '
'; } } catch (std::exception &e) { std::cout << "Error: " << e.what() << '
'; } }

Чтобы это работало в GCC, нужен флаг -std=c++17 (или -std=gnu++17), и нужно подключить библиотеку -lstdc++fs

Отобразить SVG в image

Иногда требуется отображать в textBlock картинку, с .png всё отлично, а тут попалось .svg и они игнорируются, собственно MSDN это подтвердил.

Как всё таки отобразить SVG по url ? Желательно объяснить действия шаг за шагом.
Image image = new Image(); image.Height = 50; image.Source = new BitmapImage(new Uri(src)); textBlock.Inlines.Add(image);


Ответ

Можно просто преобразовать SVG в растровое изображение и отобразить его. Это можно сделать с помощью сторонних библиотек, или, при наличии Internet Explorer 11, стандартными средствами.
Добавим ссылки на System.Drawing и COM -> Microsoft HTML Object Library. Создадим вспомогательный класс для преобразования SVG в BMP:
using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Runtime.InteropServices; using System.ComponentModel; //Reference: System.Drawing //Reference: Microsoft HTML Object Library
namespace WpfApplication1 { public class SvgConvert { //преобразует SVG, заданный строкой svgcontent, в Bitmap заданных размеров и записывает его в поток output public static void ToBitmap(string svgcontent, int w_image,int h_image,System.IO.Stream output) { RECTL rcClient = new RECTL();
bool b = SystemParametersInfo(SPI_GETWORKAREA, 0, ref rcClient, 0); if (b == false) { rcClient.bottom = 480; rcClient.right = 640; }
int width = (int)(rcClient.right - rcClient.left); int height = (int)(rcClient.bottom - rcClient.top);
IntPtr screendc = GetDC(IntPtr.Zero);
string svghtml = "" + svgcontent + "";
mshtml.HTMLDocument doc = null; mshtml.IHTMLDocument2 d2 = null; IOleObject pObj = null; IViewObject pView = null;
try { doc = new mshtml.HTMLDocument(); //создание документа d2 = (mshtml.IHTMLDocument2)doc; int hr;
//установка размера документа pObj = (IOleObject)d2; SIZEL sz = new SIZEL();
sz.x = (uint)MulDiv(width, HIMETRIC_INCH, GetDeviceCaps(screendc, LOGPIXELSX)); sz.y = (uint)MulDiv(height, HIMETRIC_INCH, GetDeviceCaps(screendc, LOGPIXELSY));
hr = pObj.SetExtent((int)System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT, ref sz); if (hr != 0) throw Marshal.GetExceptionForHR(hr);
//запись SVG в документ d2.write(svghtml); d2.close();
//преобразование в Bitmap pView = (IViewObject)d2; Bitmap bmp = new Bitmap(w_image, h_image); Graphics g = Graphics.FromImage(bmp); using (g) {
IntPtr hdc = g.GetHdc(); hr = pView.Draw((int)System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref rcClient, IntPtr.Zero, IntPtr.Zero, 0); if (hr != 0) throw Marshal.GetExceptionForHR(hr); g.ReleaseHdc(hdc); }
//сохранение bmp.Save(output, System.Drawing.Imaging.ImageFormat.Bmp);
} finally { //освобождение ресурсов if (d2 != null) Marshal.ReleaseComObject(d2); if (pObj != null) Marshal.ReleaseComObject(pObj); if (pView != null) Marshal.ReleaseComObject(pView); if (doc != null) Marshal.ReleaseComObject(doc); } }
[DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
[DllImport("user32.dll")] static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("user32.dll")] static extern bool SystemParametersInfo(int nAction, int nParam, ref RECTL rc, int nUpdate);
public static int MulDiv(int number, int numerator, int denominator) { return (int)(((long)number * numerator) / denominator); }
const int LOGPIXELSX = 88; const int LOGPIXELSY = 90; const int HIMETRIC_INCH = 2540; const int SPI_GETWORKAREA = 48;
}
[ComImport()] [GuidAttribute("0000010d-0000-0000-C000-000000000046")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IViewObject { int Draw([MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, IntPtr ptd, IntPtr hdcTargetDev, IntPtr hdcDraw, ref RECTL lprcBounds, IntPtr lprcWBounds, IntPtr pfnContinue, int dwContinue); int a(); int b(); int c(); int d(); int e(); }
[ComImport()] [Guid("00000112-0000-0000-C000-000000000046")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IOleObject { void f(); void g(); void SetHostNames(object szContainerApp, object szContainerObj); void Close(uint dwSaveOption); void SetMoniker(uint dwWhichMoniker, object pmk); void GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk); void x(); void y(); void DoVerb(uint iVerb, uint lpmsg, object pActiveSite, uint lindex, uint hwndParent, uint lprcPosRect); void EnumVerbs(ref object ppEnumOleVerb); void Update(); void IsUpToDate(); void GetUserClassID(uint pClsid); void GetUserType(uint dwFormOfType, uint pszUserType); int SetExtent(uint dwDrawAspect, ref SIZEL psizel); void GetExtent(uint dwDrawAspect, uint psizel); void Advise(object pAdvSink, uint pdwConnection); void Unadvise(uint dwConnection); void EnumAdvise(ref object ppenumAdvise); void GetMiscStatus(uint dwAspect, uint pdwStatus); void SetColorScheme(object pLogpal); };
public struct RECTL { public uint left; public uint top; public uint right; public uint bottom; }
public struct SIZEL { public uint x; public uint y; } }
Тогда отобразить по URL можно так:
string svgcontent="";
if (uri.IsFile) { svgcontent = File.ReadAllText(uri.LocalPath); } else { var client = new System.Net.WebClient(); using (client) { svgcontent = client.DownloadString(uri); } }
MemoryStream ms = new MemoryStream(); SvgConvert.ToBitmap(svgcontent, 500,500, ms);
BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.CacheOption = BitmapCacheOption.OnLoad; bi.StreamSource = ms; bi.EndInit();
Image image = new Image(); image.Source = bi; textblock.Inlines.Add(image);

Выделение частовызываемой функции в DLL

Целесообразно ли выделить функция в dll, если функция будет вызываться раз в 0,5 секунд? Вообще, какие операции должна выполнить ось чтобы выполнить ф-ию из dll?


Ответ

DLL целесообразно применять там, где один и тот же код может использоваться повторно. Также в динамические библиотеки засовывают ресурсоемкие функции, например, функции обработки различного рода хуков( на мышь, на клавиатуру и т.д ). DLL создавались Microsoft как раз с целью экономии памяти, как на жестком диске, так и в оперативной памяти. DLL - очень удобный механизм, позволяющий использовать какую-то одну функцию, не подгружая, функции другого типа и выгружать библиотеки из памяти по мере необходимости.

Как с помощью JS изменить псевдоэлемент before или after

Например есть #tool:before{ content:''; display: none; /* и т.д. */ } Как с помощью JS сделать display: block этому псевдоэлементу


Ответ

Хм, по моему никак. Как вариант это использовать несколько css файлов одинакового содержания, либо добавить на страницу блок , а также к нему написать генератор нужных стилей. Да, костыль.

Поиск по фетчу Core Dat'ы с использованием fetchedResultsController

В наличии UITableView, контент которой заполняется из Core Data при помощи fetchedResultsController'а: - (NSFetchedResultsController *) fetchedResultsController { NSLog(@"fetchedResultsController"); if (fetchedResultsController != nil) { return fetchedResultsController; }
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:[[PTDataManager sharedManager] managedObjectContext]]; [fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"agency_server_id == %@", agency.server_id]; fetchRequest.predicate = predicate;
NSSortDescriptor *sortByName1Descriptor = [[NSSortDescriptor alloc] initWithKey:@"lastname" ascending:YES]; NSSortDescriptor *sortByName2Descriptor = [[NSSortDescriptor alloc] initWithKey:@"firstname" ascending:YES]; NSSortDescriptor *sortByName3Descriptor = [[NSSortDescriptor alloc] initWithKey:@"middlename" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortByName1Descriptor, sortByName2Descriptor, sortByName3Descriptor, nil];
fetchRequest.sortDescriptors = sortDescriptors;
fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:[[PTDataManager sharedManager] managedObjectContext] sectionNameKeyPath:nil cacheName:nil]; fetchedResultsController.delegate = self; return fetchedResultsController; } другие делегатские методы не реализованы так как таблица заполняется один раз, при входе во viewController и больше не меняется. Стоит задача реализовать поиск по контенту таблицы с отображением в таблице только результатов соответствующих значениям введенным в searchBar. Реализовываю метод: - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [self reloadTableView]; } и соответственно триггеруемый метод для отображения в таблице: - (void)reloadTableView { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:[[PTDataManager sharedManager] managedObjectContext]]; [fetchRequest setEntity:entity];
NSPredicate *filterPredicate; NSString *searchString = self.searchBar.text; NSMutableArray *predicateArray = [[NSMutableArray alloc] init]; [predicateArray addObject:[NSPredicate predicateWithFormat:@"agency_server_id CONTAINS[cd] %@", agency.server_id]]; [predicateArray addObject:[NSPredicate predicateWithFormat:@"firstname CONTAINS[cd] %@", searchString]]; [predicateArray addObject:[NSPredicate predicateWithFormat:@"lastname CONTAINS[cd] %@", searchString]]; [predicateArray addObject:[NSPredicate predicateWithFormat:@"middlename CONTAINS[cd] %@", searchString]]; filterPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicateArray]; [fetchRequest setPredicate:filterPredicate];
NSSortDescriptor *sortByName1Descriptor = [[NSSortDescriptor alloc] initWithKey:@"lastname" ascending:YES]; NSSortDescriptor *sortByName2Descriptor = [[NSSortDescriptor alloc] initWithKey:@"firstname" ascending:YES]; NSSortDescriptor *sortByName3Descriptor = [[NSSortDescriptor alloc] initWithKey:@"middlename" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortByName1Descriptor, sortByName2Descriptor, sortByName3Descriptor, nil];
fetchRequest.sortDescriptors = sortDescriptors; fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:[[PTDataManager sharedManager] managedObjectContext] sectionNameKeyPath:nil cacheName:nil]; fetchedResultsController.delegate = self;
NSError *error = nil; if (![self.fetchedResultsController performFetch:&error]) { NSLog(@"Unresolved error %@, %@", [error localizedDescription], [error localizedFailureReason]); abort(); };
[self.clientsTableView reloadData]; } который похож на fetchedResultsController но как видно имеется отличия в ограничении выборки. Проблема в том, что в таком виде вызов -reloadTableView дергает и сам fetchedResultsController, в результате фетч меняется в процессе ввода символов в searchBar. В таблице появляется все что вытянул fetchedResultsController и плюс все остальное что совпадает с содержимым searchBarа. Визуально: при вводе символов в поле поиска таблица не сокращает количество результатов а увеличивает. Вопрос: на каком этапе реализации поиска по уже фетченой выборке я делаю ошибку? Могу ли я как-то изменить вторичный фетч для поиска по уже полученным из первичного фетча результатам?


Ответ

Вопрос решился через составной предикат с использованием +orPredicateWithSubpredicates: и +andPredicateWithSubpredicates: NSPredicate *orPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:firstPredicate, secondPredicate, nil]];
NSPredicate *andPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:thirdPredicate, fourthPredicate, nil]];
NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:orPredicate, andPredicate, nil]]; [fetchRequest setPredicate:finalPredicate]; В таком виде через AND сохраняется результат предварительного фетча и через дополнительные OR происходит его фильтрация согласно критериям поиска

Как передать методы класса в другой класс (iOS 7 на storyboard)

Ситуация такая, есть клас Class : UIViewController у него есть метод, к примеру - (void)displayRefresh {
} Как этот метод вызвать в другом классе Class2 : UIViewController в методе: - (IBAction)display:(id)sender {
} Вопросы: Как вызвать? Что для этого нужно?


Ответ

@leonid3452, Доброе время суток! Постараюсь объяснить на своём примере. Допустим есть два класса: "ViewController : UIViewController" и "DetailController : UIViewController" И нам нужно передать метод: - (void)displayLog с "ViewController" в "DetailController" И так, переходим к реализации: 1 что нужно сделать убедиться что метод объявлен в "ViewController.h" примерно будет выглядеть так: //ViewController.h @interface ViewController : UIViewController {
} - (void) displayLog; @end Переходим в ViewController.m реализуем метод: //ViewController.m @interface ViewController () @end
@implementation ViewController
- (void) displayLog { NSLog(@"Hello"); } @end Далее нужно вызвать этот метод (- (void) displayLog;) в DetailController, скажем по нажатию на кнопку, реализуем: //DetailController.h @interface DetailController : UIViewController {
} - (IBAction)button:(id)sender; @end Переходим в .m: //DetailController.m @interface DetailPassword () @end
@implementation DetailPassword
- (IBAction)button:(id)sender { ViewController *viewCon = [[ViewController alloc] init]; [viewCon displayLog]; } @end Я надеюсь что понятно объяснил. Если что не поняли, задавайте вопросы.

Windows-1251 против UTF-8

Создаю сайты, используя свой разработанный где-то в 2007 году движок на PHP, который с тех пор прошел всевозможные модификации и улучшения. Кодировка осталась прежняя - windows-1251. Стоит ли переходить на UTF-8? Почти все российские и зарубежные сайты используют кодировку UTF-8. В чем преимущество кодировки UTF-8 перед windows-1251, и есть ли оно вообще, это преимущество? И еще вопрос, подскажите, пожалуйста, как грамотно перейти на UTF-8, включая БД MySQL?


Ответ

Сделайте полный дамп БД, включая структуру таблиц, в старой кодировке. Перекодируйте все страницы сайта и копию дампа в UTF-8. Смените кодировку БД по-умолчанию на UTF-8, сравнение на utf8_general_ci. Удалите все таблицы. Залейте дамп в UTF-8, указав кодировку. Разумеется, смените кодировку на utf-8 в заголовках всех страниц сайта. Про преимущества юникода уже сказал @mountpoint