Поиск по этому блогу

Показаны сообщения с ярлыком Программирование. Показать все сообщения
Показаны сообщения с ярлыком Программирование. Показать все сообщения

пятница, 18 марта 2016 г.

DocsVision 4.5 - Алгоритм поиска в каком подразделении находится сотрудник

Столкнулся с задачей, как определить, в каком подразделении числится сотрудник в DocsVision.
Поиски по форумам особого результата не дали. Немного полазил по DVExplorer и подумал. В итоге алгоритм не очень сложный. Но придется по ходу работы учитывать разные нюансы. Например пользователей может быть два с одинаковым полем данных. Тогда нужно осуществлять поиск по уникальному полю.


среда, 9 марта 2016 г.

DocsVision 4,5 - Изменяем значение в справочнике сотрудников

На этот раз задача посложнее.
Нужно в DocsVision изменить значение в справочнике сотрудников в секции сотрудник.
Менять буду по принципу, если значение не равно нужному мне, то меняем.
Меня интересует поле - Тип маршрутизации - RoutingType.
В DocsVision есть простой способ для подобных действий. Это механизм FindRows. Он принимает xml запрос, по которому ищет соответствия. Им и буду пользоваться.\
P.S.  Запрос можно усложнять, делая выборку по нескольким условиям.


DocsVision 4,5 - изменение фактической даты чего - либо

Давно не наполнял свой блог новыми знаниями. Было лень и было много работы.
В данный период моей жизни я работаю с DocsVision. Пишу скрипты для бизнес - процессов.
Данная запись - шпаргалка. Чтобы не забыть как делалось.
Суть такова - нужно изменить в основной части карточки бизнес - процесса поле "фактическая дата загрузки". Поле может называться и по другому. Главное чтобы оно находилось на вкладке Основное(Основная) в карточке.

воскресенье, 9 ноября 2014 г.

Шифрование строки и расшифровка

Шифруем строку по ключу. Нужно передать строку  и ключ(с помощью которого будем шифровать в метод EncryptText), чтобы зашифровать. Чтобы расшифровать - передаем зашифрованное сообщение и ключ в метод DecryptText.

public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
        {
            byte[] encryptedBytes = null;

            // Set your salt here, change it to meet your flavor:
            // The salt bytes must be at least 8 bytes.
            byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;

                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                        cs.Close();
                    }
                    encryptedBytes = ms.ToArray();
                }
            }

            return encryptedBytes;
        }

        public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
        {
            byte[] decryptedBytes = null;

            // Set your salt here, change it to meet your flavor:
            // The salt bytes must be at least 8 bytes.
            byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;

                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                        cs.Close();
                    }
                    decryptedBytes = ms.ToArray();
                }
            }

            return decryptedBytes;
        }

        public static string EncryptText(string input, string password)
        {
            // Get the bytes of the string
            byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(input);
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

            // Hash the password with SHA256
            passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

            byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);

            string result = Convert.ToBase64String(bytesEncrypted);

            return result;
        }

        public static string DecryptText(string input, string password)
        {
            // Get the bytes of the string
            byte[] bytesToBeDecrypted = Convert.FromBase64String(input);
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
            passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

            byte[] bytesDecrypted = AES_Decrypt(bytesToBeDecrypted, passwordBytes);

            string result = Encoding.UTF8.GetString(bytesDecrypted);

            return result;
        }

Набор полезных JS скриптов

Сюда входят:
1 использование jquery элемента blockUI
2 проверка полей телефона и поля суммы
3 работа с cookie

Footer в ASP NET

В тег form добавляем div, в котором есть ещё один div с пометкой class="mainWindow"( margin: 0 auto; width: 1024px;  height: 768px;),  а в него div с class="footer"(float: left; width: 1024px; height: 25px;).
ContentPlaceHolder помещаем в div с class="workPlace"(float: left;width: 1024px; height: 610px;)


пятница, 12 июля 2013 г.

Поиск файла по всем дискам

Поиск файла по всем дискам и директориям.



static void Main(string[] args)
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                FindFiles(drive.RootDirectory.ToString(), "notepad++.exe");
            }
            Console.Out.WriteLine("Press any key");
            Console.ReadKey();
        }

        public static void FindInDir(DirectoryInfo dir, string pattern, bool recursive)
        {
            Task.Factory.StartNew(() =>
            {
                try
                {
                    foreach (FileInfo file in dir.GetFiles(pattern))
                    {
                        Console.Out.WriteLine(file.FullName);
                    }
                }
                catch (UnauthorizedAccessException)
                {
                }

                if (recursive)
                {
                    DirectoryInfo[] subdir = dir.GetDirectories();
                    int i;
                    int l = subdir.Length;
                    for (i = 1; i < l; i++)
                    {
                        try
                        {
                            FindInDir(subdir[i], pattern, recursive);
                        }
                        catch (UnauthorizedAccessException)
                        {
                            Console.Out.WriteLine("Отказано в доступе " + subdir[i].Name);
                        }
                    }
                }
            });
        }
        public static void FindFiles(string dir, string pattern)
        {
            Task.Factory.StartNew(() =>
            {
                FindInDir(new DirectoryInfo(dir), pattern, true);
            });
        }
    }

понедельник, 25 марта 2013 г.

Сравнение строк без учета регистра

Заметка.
Два способа сравнить строки без учета регистра букв.
Первый через регулярные выражения, а второй через свойство OrdinalIgnoreCase у IndexOf.


Regexp reg = new Regexp("что ищешь", RegexOptions.IgnoreCase)
Match n = new.Match(string)


if(stringToTest.IndexOf("myvalue", StringComparison.OrdinalIgnoreCase) >= 0)
{
   //строки совпали
}
else
{
   //строки не совпали
}

среда, 3 октября 2012 г.

WPF file explorer часть 2

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

  • открытие выделенного файла в списке
  • копирование выделенного файла в списке (копирование из одной папки в другую)
  • удаление выделенного файла в списке (удаление файла из папки)
  • выделение всех файлов в списке


Открытие


private void Open_selectItem(object sender, RoutedEventArgs e)
        {
            FileInfo filinf = listBox1.SelectedItem as FileInfo;
            try 
            {
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = filinf.FullName;
                p.Start();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

воскресенье, 23 сентября 2012 г.

WPF file explorer


Был долго занят с работой, поэтому ничего нового не публиковал. Вот появилось время, решил написать про файловый менеджер.
Задачи:
просмотр дисков и папок компьютера
показывание файлов, находящихся на диске или в папке.
В общем идея такая, чтобы рядом с именем диска была стрелочка, которая разворачивает вниз список папок, а рядом, во втором окне, показывались файлы.
Делал на WPF. Добавляем 1 treeview и 1 listview(пробовал с listBox, но там глюк с отображением содержимого папок), затем пишем такой код.



public MainWindow()
        {
            InitializeComponent();
            TreeViewDrivers();
        }
void TreeViewDrivers() 
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                TreeViewItem item = new TreeViewItem();
                item.Tag = drive;
                item.Header = drive.ToString();
                item.Items.Add("*");
                //trw_Products.Items.Add(item);
                treeView1.Items.Add(item);

                item.Expanded += new RoutedEventHandler(item_DirExpanded);
            }
        }

вторник, 17 июля 2012 г.

Изменяем TabControl через XAML

Занялся изменением внешнего стиля TabControl. Хотелось сделать угловатые закладки как в Expression Blend 4(в самой программе) или как в Google Chrome. Есть некоторые НЕДОРАБОТКИ, но всё вполне функционирует.  Единственное неудобство - GRID в TabItem автоматичесски подстраивается под содержимое. Для начала поискал пару примеров, в общем вот что получилось.
Всё запихиваем в <Windows.Resurces>


<Style TargetType="{x:Type TabItem}">
            <Setter Property="SnapsToDevicePixels" Value="true"/>
            <Setter Property="OverridesDefaultStyle" Value="true"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Grid Margin="0,0,-12,0">
                            <!--Самостоятельная проба создать вкладки-->
                            <Border Name="Border" Background="Transparent" BorderBrush="Transparent"
                                    BorderThickness="1,1,1,1" CornerRadius="6,6,0,0" />
                            <Path Name="Blablabla" Data="M0.5,3.5 C0.5,1.8431458 1.8431458,0.5 3.5,0.5 L46.5,0.5 C48.156854,0.5 75.082788,25.5 70.333333,25.5 65.583878,25.5 0.75000088,25.249498 0.5,25.583056 0.24999912,25.916615 0.5,10.944442 0.5,3.5 z" 
              Fill="Black" HorizontalAlignment="Left" Height="26.089" Stretch="Fill" Stroke="White" 
              VerticalAlignment="Bottom"  Width="110"/>
                            <ContentPresenter x:Name="ContentSite" TextElement.Foreground="White" ContentSource="Header" VerticalAlignment="Center"
                                              HorizontalAlignment="Center" Margin="0,0,18,0"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter TargetName="Border" Property="Background" Value="Orange" />
                                <Setter Property="Panel.ZIndex" Value="100" />
                            </Trigger>
                            <Trigger Property="IsSelected" Value="false">
                                <Setter TargetName="ContentSite" Property="TextElement.Foreground" Value="White"/>
                                <Setter TargetName="Border" Property="Background" Value="Transparent"/>

                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

понедельник, 2 июля 2012 г.

Как вытащить путь до файла через ярлык

Изначально я просто решил опробовать Drag and drop в WPF и Win Form. Сделал окошко, где был ListBox, сделал так, чтобы в него можно было перетащить файлы. В ListBox'e показывался путь до этого файла, то есть то место, откуда я  перетащил файл. Потом появилась идея каким - то образом заставить программу выдавать путь до файла, в моём случае через ярлык, узнать, где установлена программа. В общем, нашёлся такой путь решения.
GetFullPath используется как метод-функция.

 // Таким образом узнаем путь до файла, через ярлык
        string GetFullPath(FileInfo file)
        {
            // проверяем, является ли файл ярлыком
            if (file.Extension == ".lnk")
            {
                using (var fstream = File.Open(file.FullName, FileMode.Open, FileAccess.Read))
                {
                    using (var reader = new BinaryReader(fstream))
                    {
                        fstream.Seek(0x14, SeekOrigin.Begin);
                        var flags = reader.ReadUInt32();
                        if ((flags & 0x01) == 1)
                        {
                            fstream.Seek(0x4c, SeekOrigin.Begin);
                            var itemIdLength = reader.ReadUInt16();
                            fstream.Seek(itemIdLength, SeekOrigin.Current);
                        }
                        var start = fstream.Position;
                        var length = reader.ReadUInt32();
                        fstream.Seek(0x0c, SeekOrigin.Current);
                        var offset = reader.ReadUInt32();
                        fstream.Seek(start + offset, SeekOrigin.Begin);
                        return new string(reader.ReadChars((int)(start + length - fstream.Position)));
                    }
                }
            }
            else
                return file.FullName;
        }

суббота, 16 июня 2012 г.

WPF clock

Ещё одни электронные часы, только теперь на WPF. Всё делается намного прощё, хотя впринципе и в Win Form можно было бы сделать так же.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace MyTimer
{
       
       /// 
       /// Interaction logic for MainWindow.xaml
       /// 
       
       
       public partial class MainWindow : Window
       {
              DispatcherTimer timer;
              
              public MainWindow()
              {
                     this.InitializeComponent();

                     timer = new DispatcherTimer();
                     timer.Interval = TimeSpan.FromSeconds(1.0);
                     timer.Start();
                     timer.Tick += new EventHandler(delegate(object s, EventArgs a)
        {
                     
                       tb.Text = "" + DateTime.Now.Hour +":"
                     + DateTime.Now.Minute +":"
                     + DateTime.Now.Second;
              
         
        });
              }
                     
       }
}

четверг, 31 мая 2012 г.

Электронные часы

Мне нравится писать программы по чьи-то примерам. Я так быстрее учусь программировать. Недавно писал простенький файловый менеджер, исходник которого был для консольного приложения. Немного поэксперементировав, я смог его сделать в Win Form. Что касается электронных часов - это первая программа, которую я вообще хотел написать. И вот ещё один вариант таких часов, но уже с использованием потоков.

четверг, 24 мая 2012 г.

Программа сама себя копирует

После пересмотра Железного человека задался вопросом, а как заставить программу саму себя скопировать куда - либо (в другое место). Задача стояла так - нужно либо ввести в консоль команду,  либо нажать кнопку, чтобы программа выполнила копирование самой себя в другую папку. Вот в принципе 2 варианта решения этой задачи. Один вариант сделан на основы одной из программ, которую я уже выкладывал.
Вот первый (здесь нужно вставить названия папки, чтобы программа знала куда копироваться):

            // Полный путь к программе.
            string currentAssembly = Assembly.GetExecutingAssembly().Location;
            // Название файла программы.
            string fileName = Path.GetFileName(currentAssembly);
            // Папка назначения.
            string destinationDirectory = Path.Combine(Directory.GetCurrentDirectory(), "copy");
            // Проверяем, есть ли директория, если нет - создаём.
            if (!Directory.Exists(destinationDirectory))
                Directory.CreateDirectory(destinationDirectory);
            // Копируем в заданную папку, перезаписывая, при необходимости.
            File.Copy(currentAssembly, Path.Combine(destinationDirectory, fileName), true);
            Console.WriteLine("Скопировано.");
            Console.ReadKey();

Вот второй:


        static void Main(string[] args)
        {
            Console.WriteLine("введите команду");
            string command = Console.ReadLine();
            if(command == "копируй себя")
            {
                CopyFolder(@"D:\Working\project\Новая папка\copiesItselfTo",
                    @"d:\__autoSeo_results\copiesItselfTo");
                Console.WriteLine("Копирование завершено");
            }
            Console.ReadLine();
        }
        static public void CopyFolder(string sourceFolder, string destFolder)
        {
            // Directory.Exists - Определяет, указывает ли заданный путь на существующий каталог на диске
            if (!Directory.Exists(destFolder))
                Directory.CreateDirectory(destFolder);
            string[] files = Directory.GetFiles(sourceFolder);
            //Directory.GetFiles - Возвращает имена файлов (с указанием пути к ним) в указанном каталоге
            foreach (string file in files)
            {
                string name = Path.GetFileName(file);
                string dest = Path.Combine(destFolder, name);
                File.Copy(file, dest);
            }
            string[] folders = Directory.GetDirectories(sourceFolder);
            foreach (string folder in folders)
            {
                string name = Path.GetFileName(folder);
                string dest = Path.Combine(destFolder, name);
                CopyFolder(folder, dest);
            }
        }

воскресенье, 20 мая 2012 г.

Перемешивание списка

Иногда бывает нужно перемешать(отсортировать) определённый список или массив данных в случайном порядке.
Вот один вариант решения данной задачи:

    class Randoming
    {
        public static void MixList<t>(IList<t> list) 
        {
            Random r = new Random();
            //Создаем сортируемый список и набиваем в него значения из 
            //целевого списка. Тип SortedList устроен так, что при добавлении 
            //нового элемента, он (элемент) помещается не в конец списка 
            //элементов, а между ними, обеспечивая моментальную автоматическую 
            //сортировку списка
            SortedList<int, t> mixedList = new SortedList<int, t>();
            //заполняем список
            foreach (t item in list)
                mixedList.Add(r.Next(), item);

            list.Clear();
            for (int i = 0; i < mixedList.Count; i++)
            {
                list.Add(mixedList.Values[i]);
            }  
        }
    }
        
static void Main(string[] args)
        {
            Console.WriteLine("Сейчас будет рандомная сортировка");
            List<string> myList = new List<string>();
            //List<string> result = new List<string>();
            for (int i = 0; i < 50; i++)
                myList.Add(i.ToString());
            Randoming.MixList(myList);
            foreach(var ml in myList)
            {
                //result.Add(ml);
                Console.WriteLine(ml);
            }
            //Console.WriteLine(result);
            Console.ReadLine();
        }

Получаем исходный код страницы

Код не мой, просто нашёл пример, который мне понравился. Вот решил добавить его себе в блог, вдруг пригодится когда - нибудь. По мере изучения исходника программы, понял, что не так и сложно это было написать самому. Но ввиду того, что я не так долго занимаюсь программированием - стараюсь находить, в основном готовые программы, чтобы покапаться в их коде. Сам пишу пока что простенькие программы.
Для начала кидаем на форму две кнопки, один текст бокс(называем его urlTextBox ) и один  richTextBox1. Размещаем это по форме как угодно.
Задача - получить исходный код страницы.
Вот реализация:

        private void button1_Click(object sender, EventArgs e)
        {
            //Программа достаёт исходный код страницы
            //создаём строку url,в которой будем указывать адресс сайта
            string url = urlTextBox.Text;
            //Создаём объект , который будет выполнять запрос к URI(идентификатор ресурса)
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            //GetResponse - возвращает ответ на интернет-запрос
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            //Реализуем считывание символов из потока байтов в определенной кодировке.
            //GetResponseStream -  возвращает поток данных из  интернет-ресурса
            StreamReader sr = new StreamReader(response.GetResponseStream());
            //Читаем поток от начала до конца
            richTextBox1.Text = sr.ReadToEnd();
            //закрываем поток
            sr.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //очишаем поле
            richTextBox1.Clear();
        }

пятница, 18 мая 2012 г.

Быстрая сортировка

Решил уделить больше внимание различным сортировкам на C#. Первая, которую решил осуществить  -  Quick Sort (Быстрая сортировка). Один из быстрых известных универсальных алгоритмов сортировки массивов. Суть алгоритма:
  • из массива выбирается элемент. Как правило, в качестве этого элемента берется центральный элемент массива. 
  • остальные элементы распределяются таким образом, чтобы слева  оказались все элементы, меньшие или равные опорному элементу. Элементы, большие или равные опорному элементу, помещаются справа. 

пятница, 4 мая 2012 г.

Получение информации о ПК

Собрал несколько исходных кодов для получения информации о ПК в консольном приложении.
В коде присутствует System.Management. Чтобы его добавить нужно пройти в Solution Explorer, найти там в списке своей программы References, нажать правой кнопкой мыши ->Add->выбрать NET и найти там  System.Management.
В общем сами коды:

Список всех активных процессов в системе

ManagementObjectSearcher searcher =
        new ManagementObjectSearcher("root\\CIMV2",
           "Select Name, CommandLine From Win32_Process");

            foreach (ManagementObject instance in searcher.Get())
            {
                Console.WriteLine("{0}", instance["Name"]);
            }
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey();

четверг, 3 мая 2012 г.

Копирование папки и файлов

Задача: скопировать папку и все файлы, которые находятся в ней.
Решение:

static void Main(string[] args)
        {
            
            CopyFolder( @"d:\__autoSeo_results\temptest", @"d:\__autoSeo_results\tempout" );
            Console.ReadLine();
        }    
        static public void CopyFolder( string sourceFolder, string destFolder )
        {
            // Directory.Exists - Определяет, указывает ли заданный путь на существующий каталог на диске
            if (!Directory.Exists( destFolder ))
                Directory.CreateDirectory( destFolder );
            string[] files = Directory.GetFiles( sourceFolder );
            //Directory.GetFiles - Возвращает имена файлов (с указанием пути к ним) в указанном каталоге
            foreach (string file in files)
            {
                string name = Path.GetFileName( file );
                string dest = Path.Combine( destFolder, name );
                File.Copy( file, dest );
            }
            string[] folders = Directory.GetDirectories( sourceFolder );
            foreach (string folder in folders)
            {
                string name = Path.GetFileName( folder );
                string dest = Path.Combine( destFolder, name );
                CopyFolder( folder, dest );
            }
        }