Толик Панков
hex_laden
............ .................. ................
Back September 6th, 2019 Forward
C#. Работа с .ZIP архивами (подходит для старых .NET Framework'ов 3.5, 2.0)

Когда-то давно какой-то хороший человек написал библиотеку для работы с ZIP (а еще и Bzip2) архивами.

Приведу только простой пример использования - распаковка ZIP-архива в каталог:

public static bool UnzipToDir(string FileName,string UnzipDir)
{
    ZipFile zip = null;

    try
    {
        zip = ZipFile.Read(FileName);
        foreach (ZipEntry e in zip)
        {
            e.Extract(UnzipDir, 
                ExtractExistingFileAction.OverwriteSilently); 
                // перезаписывать существующие
        }
    }
    catch (Exception ex)
    {
        ErrorMessage = ex.Message;
        return false;
    }
    return true;
}


До использования, естественно, библиотеку надо подключить в References'ах и прописать using:

using Ionic.Zip;

Источник (более подробное описание)


Работа с zip-архивами в .NET Framework 3.5 на C# Копия в PDF

Библиотека


1. Ссылка на Codeplex Archive
2. Скачать библиотеку с codernotes.ru
3. Копия архива Codeplex на nega.nz
4. Библиотека на Mega.nz

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/09/05/c-rabota-s-zip-arhivami-podhodit-dlya-staryh-net-framework-ov-3-5-2-0/

Tags: ,
C# Windows Forms. Использование ListView для логов, автоматическая прокрутка ListView, избавление от

Преамбула


Иногда надо отображать пользователю ход процесса, т.е., что в данный момент наша программа делает. Лучше всего, на мой взгляд, для такого подходит компонент ListView.

В него будем писать лог наших действий. Замутим тестовое приложение:

- Создадим форму с ListView и кнопкой "Начать"
- По нажатию кнопки "Начать" запустим отдельный поток, который будет выводить нам числа от 1 до 100, и генерировать событие.

Подготовка ListView


В коде или в конструкторе установим основные опции для ListView. Нам нужно, чтобы он отображал все, как список. Ну так, как выводится лог в консоль. Устанавливаем соответствующие свойства:

View = Details

Теперь идем в конструктор, ищем опцию Columns, и добавляем единственную колонку:
В появившемся окне все удаляем из поля Text, жмем OK, смотрим на размер (Size) ListWiev, возвращаемся в редактирование колонок, и правим свойство Width. Устанавливаем чуть меньше, чем размер самого ListWiev.

Отладили, посмотрели чтоб было красиво? Ставим

HeaderStyle = None (чтоб не отображался заголовок колонки, заголовки были убраны).

Первый тест


Несмотря на то, что все действия происходят в отдельном потоке, ListView дергается и дрожит:


https://youtu.be/6Un0TSmyw38

На GitHub

Избавляемся от дергания и дрожания

Для этого делаем новый контрол, наследник от ListView и в коде нового класса подправляем параметр отображения:

class MyListView:ListView
{
    public MyListView()
    {            
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
    }
}

Используем новый контрол вместо ListView. Ничего не дрожит и не дергается.

Автоматическая прокрутка ListView


При добавлении нового элемента:

Достаточно при добавлении в ListView устанавливать свойство TopItem в значение последнего элемента. Тогда у ListView появится автоматическая прокрутка:

lvOut.TopItem = lvOut.Items[lvOut.Items.Count - 1];

Результат





https://youtu.be/IzPIf5X8zQQ

Пример


На GitHub

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/09/05/c-windows-forms-ispolzovanie-listview-dlya-logov-avtomaticheskaya-prokrutka-listwiev-izbavlenie-ot-drozhaniya/

Tags: ,
C#. Простой парсинг HTML Regerp'ом.

Преамбула


Да, предваряя камни, которые в меня полетят. Так делать нельзя, неправильно и вообще некузяво. Но что я буду делать, если нормальных парсеров под .NET Framework 2.0 уже net, а задача маленькая - найти все теги <a> или <img> и выдрать из них, соответственно, значение атрибутов href или src.

Решение


public List<string> ParseTags(string Tag, string Property)
{
    List<string> listBuf = new List<string>();

    Regex reHref = new Regex(@"(?inx)
                                <" + Tag + @" \s [^>]*" +
                                    Property + @"\s* = \s*"+
                                        @"(?<q> ['""] )"+
                                            @"(?<url> [^""]+ )"+
                                         @"\k<q>"+
                                 @"[^>]* >");

    foreach (Match match in reHref.Matches(HTMLPage))
    {
        listBuf.Add(match.Groups["url"].ToString());
    }

    return listBuf;
}


Это немного видоизмененное решение (добавил возможность подставлять в регулярное выражение тег и атрибут) из одной статьи на Хабре. Заметка, как обычно, от склероза.

Плюс добавлена функция выбора из найденного, уже без всяких регулярных выражений, с помощью string.Contains(<строка>).

public List<string> Select(string Pattern, List<string> inputList)
{
    List<string> selectList = new List<string>();

    foreach (string s in inputList)
    {
        if (s.Contains(Pattern))
        {
            selectList.Add(s);
        }
    }

    return selectList;
}


Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/09/06/c-prostoj-parsing-html-regerp-om/

Tags: ,
Back September 6th, 2019 Forward